为Qt组件添加右键菜单一般遵循如下步骤:
创建右键菜单中的动作并为每个动作指定槽函数
将组件的contextMenuPolicy属性设置为Qt::CustomContextMenu
定义连接于组件customContextMenuRequested信号的槽函数,并在其中添加弹出右键菜单的代码
通过QtCreator,在C:\Users\Minwei\Projects\Qt路径下,创建名为ContextMenu的项目。
C:\Users\Minwei\Projects\Qt\ContextMenu\ContextMenu.qrc:
xxxxxxxxxx
61<RCC>
2 <qresource prefix="/">
3 <file>images/AppIcon.ico</file>
4 <file>images/exit.bmp</file>
5 </qresource>
6</RCC>
C:\Users\Minwei\Projects\Qt\ContextMenu\contextmenudialog.ui:
xxxxxxxxxx
631
2<ui version="4.0">
3 <class>ContextMenuDialog</class>
4 <widget class="QDialog" name="ContextMenuDialog">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>400</width>
10 <height>300</height>
11 </rect>
12 </property>
13 <property name="contextMenuPolicy">
14 <enum>Qt::CustomContextMenu</enum>
15 </property>
16 <property name="windowTitle">
17 <string>右键菜单</string>
18 </property>
19 <property name="windowIcon">
20 <iconset resource="ContextMenu.qrc">
21 <normaloff>:/images/AppIcon.ico</normaloff>:/images/AppIcon.ico</iconset>
22 </property>
23 <action name="m_actAbout">
24 <property name="icon">
25 <iconset resource="ContextMenu.qrc">
26 <normaloff>:/images/AppIcon.ico</normaloff>:/images/AppIcon.ico</iconset>
27 </property>
28 <property name="text">
29 <string>关于...</string>
30 </property>
31 </action>
32 <action name="m_actExit">
33 <property name="icon">
34 <iconset resource="ContextMenu.qrc">
35 <normaloff>:/images/exit.bmp</normaloff>:/images/exit.bmp</iconset>
36 </property>
37 <property name="text">
38 <string>退出</string>
39 </property>
40 </action>
41 </widget>
42 <resources>
43 <include location="ContextMenu.qrc"/>
44 </resources>
45 <connections>
46 <connection>
47 <sender>m_actExit</sender>
48 <signal>triggered()</signal>
49 <receiver>ContextMenuDialog</receiver>
50 <slot>close()</slot>
51 <hints>
52 <hint type="sourcelabel">
53 <x>-1</x>
54 <y>-1</y>
55 </hint>
56 <hint type="destinationlabel">
57 <x>399</x>
58 <y>299</y>
59 </hint>
60 </hints>
61 </connection>
62 </connections>
63</ui>
C:\Users\Minwei\Projects\Qt\ContextMenu\contextmenudialog.h:
xxxxxxxxxx
261
2
3
4
5
6QT_BEGIN_NAMESPACE
7namespace Ui { class ContextMenuDialog; }
8QT_END_NAMESPACE
9
10class ContextMenuDialog : public QDialog
11{
12 Q_OBJECT
13
14public:
15 ContextMenuDialog(QWidget *parent = nullptr);
16 ~ContextMenuDialog();
17
18private slots:
19 void on_ContextMenuDialog_customContextMenuRequested(const QPoint &pos);
20 void on_m_actAbout_triggered();
21
22private:
23 Ui::ContextMenuDialog *ui;
24};
25
26// CONTEXTMENUDIALOG_H
C:\Users\Minwei\Projects\Qt\ContextMenu\contextmenudialog.cpp:
xxxxxxxxxx
371
2
3
4
5
6
7ContextMenuDialog::ContextMenuDialog(QWidget *parent)
8 : QDialog(parent)
9 , ui(new Ui::ContextMenuDialog)
10{
11 ui->setupUi(this);
12}
13
14ContextMenuDialog::~ContextMenuDialog()
15{
16 delete ui;
17}
18
19void ContextMenuDialog::on_ContextMenuDialog_customContextMenuRequested(const QPoint &pos)
20{
21 Q_UNUSED(pos)
22
23 QMenu* menuPopup = new QMenu;
24
25 menuPopup->addAction(ui->m_actAbout);
26 menuPopup->addSeparator();
27 menuPopup->addAction(ui->m_actExit);
28
29 menuPopup->exec(QCursor::pos());
30
31 delete menuPopup;
32}
33
34void ContextMenuDialog::on_m_actAbout_triggered()
35{
36 QMessageBox::about(this, windowTitle(), "右键菜单演示程序\n版本:1.0");
37}
运行效果如图所示: