Qt5 上下文菜單的三種實現方式

#-------------------------------------------------
#
# Project created by QtCreator 2015-08-14T21:19:04
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = PasswordEdit
TEMPLATE = app


SOURCES += main.cpp\
        dialog.cpp \
    pwdlineedit.cpp \
    lineeditmodmenu.cpp

HEADERS  += dialog.h \
    pwdlineedit.h \
    lineeditmodmenu.h


#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
class QLineEdit;

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();

public slots:
    void onActions();
    void onContext(const QPoint&);

};

#endif // DIALOG_H

#include "dialog.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QDebug>
#include <QMouseEvent>
//#include "pwdlineedit.h"
#include "lineeditmodmenu.h"
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    QVBoxLayout *boxLayout = new QVBoxLayout;

    // 上下文菜單的第一種方式
    QLineEdit *edit = new LineEditModMenu;//PwdLineEdit;
    edit->setPlaceholderText(tr("DefaultContextMenu"));
    edit->setToolTip(tr("默認上下文菜單"));


    // 上下文菜單的第二種方式
    QLineEdit *actionEdit = new QLineEdit;
    actionEdit->setPlaceholderText(tr("ActionsContextMenu"));
    actionEdit->setContextMenuPolicy(Qt::ActionsContextMenu);
    {
        QAction *a1 = new QAction("Action1", this);
        QAction *a2 = new QAction("Action2", this);
        QAction *a3 = new QAction("Action3", this);
        QAction *a4 = new QAction("Action4", this);

        connect(a1, SIGNAL(triggered(bool)), this, SLOT(onActions()));
        connect(a2, SIGNAL(triggered(bool)), this, SLOT(onActions()));
        connect(a3, SIGNAL(triggered(bool)), this, SLOT(onActions()));
        connect(a4, SIGNAL(triggered(bool)), this, SLOT(onActions()));

        actionEdit->addAction(a1);
        actionEdit->addAction(a2);
        actionEdit->addAction(a3);
        actionEdit->addAction(a4);
    }
    // 上下文菜單的第三種方式
    QLineEdit *customEdit = new QLineEdit;
    customEdit->setContextMenuPolicy(Qt::CustomContextMenu);
    customEdit->setPlaceholderText(tr("CustomContextMenu"));
    connect(customEdit, SIGNAL(customContextMenuRequested(const QPoint&)),this, SLOT(onContext(const QPoint&)));//this是datatable所在窗口

    // 無上下文菜單
    QLineEdit *noEdit = new QLineEdit;
    noEdit->setContextMenuPolicy(Qt::NoContextMenu);
    noEdit->setPlaceholderText(tr("NoContextMenu"));
    noEdit->setToolTip(tr("設定無菜單"));

    // 無上下文菜單
    QLineEdit *preventEdit = new QLineEdit;
    preventEdit->setContextMenuPolicy(Qt::PreventContextMenu);
    preventEdit->setPlaceholderText(tr("PreventContextMenu"));
    preventEdit->setToolTip(tr("設定無菜單"));


    boxLayout->addWidget(edit);
    boxLayout->addWidget(actionEdit);
    boxLayout->addWidget(customEdit);
    boxLayout->addWidget(noEdit);
    boxLayout->addWidget(preventEdit);
    this->setLayout(boxLayout);


}

void Dialog::onActions()
{
    QAction* ac =  qobject_cast<QAction*>(sender());

    if(!ac) return;

    qDebug() << ac->text().toStdString().c_str();
}

void Dialog::onContext(const QPoint& ps)
{
    QMenu* menu = new QMenu(this);
    QAction *a1 = menu->addAction("Custom 1");
    QAction *a2 = menu->addAction("Custom 2");
    QAction *a3 = menu->addAction("Custom 3");
    QAction *a4 = menu->addAction("Custom 4");

    connect(a1, SIGNAL(triggered(bool)), this, SLOT(onActions()));
    connect(a2, SIGNAL(triggered(bool)), this, SLOT(onActions()));
    connect(a3, SIGNAL(triggered(bool)), this, SLOT(onActions()));
    connect(a4, SIGNAL(triggered(bool)), this, SLOT(onActions()));
    menu->exec(QCursor::pos());//在當前鼠標位置顯示

}

Dialog::~Dialog()
{

}

#ifndef LINEEDITMODMENU_H
#define LINEEDITMODMENU_H

#include <QObject>
#include <QLineEdit>
#include <QMenu>

class LineEditModMenu:public QLineEdit
{
    Q_OBJECT
public:
    LineEditModMenu(QWidget *parent = 0);

public slots:
    void on_menu();

private:
    virtual void contextMenuEvent(QContextMenuEvent *);
private:
    QMenu *menu;
};

#endif // LINEEDITMODMENU_H


#include "lineeditmodmenu.h"
#include <QDebug>
LineEditModMenu::LineEditModMenu(QWidget *parent)
    :QLineEdit(parent)
{
    menu = new QMenu(this);
    QAction *qa1 = menu->addAction(tr("子項1"));
    QAction *qa2 = menu->addAction(tr("子項2"));

    {
        QMenu *menu2 = new QMenu(this);
        QAction * _qa1 = menu2->addAction("--子項1");
        QAction * _qa2 = menu2->addAction("--子項2");
        QAction * _qa3 = menu2->addAction("--子項3");
        QAction * _qa4 = menu2->addAction("--子項4");
        QAction * _qa5 = menu2->addAction("--子項5");
        QAction * _qa6 = menu2->addAction("--子項6");
        connect(_qa1,SIGNAL(triggered(bool)),this,SLOT(on_menu()));
        connect(_qa2,SIGNAL(triggered(bool)),this,SLOT(on_menu()));
        connect(_qa3,SIGNAL(triggered(bool)),this,SLOT(on_menu()));
        connect(_qa4,SIGNAL(triggered(bool)),this,SLOT(on_menu()));
        connect(_qa5,SIGNAL(triggered(bool)),this,SLOT(on_menu()));
        connect(_qa6,SIGNAL(triggered(bool)),this,SLOT(on_menu()));
        qa2->setMenu(menu2);
    }

    QAction *qa3 = menu->addAction(tr("子項3"));
    QAction *qa4 = menu->addAction(tr("子項4"));
    QAction *qa5 = menu->addAction(tr("子項5"));

    connect(qa1,SIGNAL(triggered(bool)),this,SLOT(on_menu()));
    connect(qa2,SIGNAL(triggered(bool)),this,SLOT(on_menu()));
    connect(qa3,SIGNAL(triggered(bool)),this,SLOT(on_menu()));
    connect(qa4,SIGNAL(triggered(bool)),this,SLOT(on_menu()));
    connect(qa5,SIGNAL(triggered(bool)),this,SLOT(on_menu()));

}

void LineEditModMenu::on_menu()
{
    QAction* ac =  qobject_cast<QAction*>(sender());

    if(!ac) return;

    qDebug() << ac->text().toStdString().c_str();

}

void LineEditModMenu::contextMenuEvent(QContextMenuEvent *event)
{

    menu->exec(QCursor::pos());
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章