#-------------------------------------------------
#
# 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());
}