给QPushButton添加右键菜单,其中ActionsContextMenu相对比较方便实现。说是给QPushButton添加右键菜单,其实对于所有的QWidget都是可以的,也就是说这种方法适合给所有的QWidget添加右键菜单。只需要继承QWidget,然后设置使用Actions Context菜单,创建自己需要的QAction,addAction并且将对应的槽函数和action连接起来,就可以实现了。下面以QPushButton为例详细说明一下:
在头文件中声明自己所需要的QAction:
QAction *m_actionOne; QAction *m_actionTwo; QAction *m_actionThree;
声明对应QAction的槽函数:
protected slots: void actionOneSlot(); void actionTwoSlot(); void actionThreeSlot();
在源文件中设置使用Actions Context菜单:
setContextMenuPolicy(Qt::ActionsContextMenu);
创建每个QAction,并且添加addAction,设置每个action的菜单名称:
m_actionOne = new QAction(this); m_actionTwo = new QAction(this); m_actionThree = new QAction(this); m_actionOne->setText("ActionOne"); m_actionTwo->setText("ActionTwo"); m_actionThree->setText("ActionThree"); addAction(m_actionOne); addAction(m_actionTwo); addAction(m_actionThree);
实现对应的槽函数:
void ButtonContextMenu::actionOneSlot() { qDebug() << "actionOne"; } void ButtonContextMenu::actionTwoSlot() { qDebug() << "actionTwo"; } void ButtonContextMenu::actionThreeSlot() { qDebug() << "actionThree"; }
将槽函数和action对应连接起来:
connect(m_actionOne, SIGNAL(triggered()), this, SLOT(actionOneSlot())); connect(m_actionTwo, SIGNAL(triggered()), this, SLOT(actionTwoSlot())); connect(m_actionThree, SIGNAL(triggered()), this, SLOT(actionThreeSlot()));编译,运行,就可以查看结果了:
点击菜单中对应的action,就可以激发对应的槽函数,并执行你具体实现的功能,
在这里我只是做了简单的输出字符串,在控制台可以查看:
完整代码:
#include <QtWidgets/QPushButton> #include <QAction> class ButtonContextMenu : public QPushButton { Q_OBJECT public: ButtonContextMenu(QWidget *parent = 0); ~ButtonContextMenu(); protected slots: void actionOneSlot(); void actionTwoSlot(); void actionThreeSlot(); private: QAction *m_actionOne; QAction *m_actionTwo; QAction *m_actionThree; }; #endif // BUTTONCONTEXTMENU_H
#include "buttoncontextmenu.h" #include <QDebug> ButtonContextMenu::ButtonContextMenu(QWidget *parent) : QPushButton(parent) { setContextMenuPolicy(Qt::ActionsContextMenu); m_actionOne = new QAction(this); m_actionTwo = new QAction(this); m_actionThree = new QAction(this); m_actionOne->setText("ActionOne"); m_actionTwo->setText("ActionTwo"); m_actionThree->setText("ActionThree"); addAction(m_actionOne); addAction(m_actionTwo); addAction(m_actionThree); connect(m_actionOne, SIGNAL(triggered()), this, SLOT(actionOneSlot())); connect(m_actionTwo, SIGNAL(triggered()), this, SLOT(actionTwoSlot())); connect(m_actionThree, SIGNAL(triggered()), this, SLOT(actionThreeSlot())); } ButtonContextMenu::~ButtonContextMenu() { } void ButtonContextMenu::actionOneSlot() { qDebug() << "actionOne"; } void ButtonContextMenu::actionTwoSlot() { qDebug() << "actionTwo"; } void ButtonContextMenu::actionThreeSlot() { qDebug() << "actionThree"; }
#include "buttoncontextmenu.h" #include <QtWidgets/QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; ButtonContextMenu b(&w); b.setText("Button"); w.show(); return a.exec(); }源码下载:http://download.csdn.net/detail/u011417605/9465246
本文地址:http://blog.csdn.net/u011417605/article/details/50921207
交流QQ:1245178753