在QListWidget上右击鼠标弹出删除菜单
第一步,创建一个包含两条数据的QListWidget
1 /*初始化一个包含两个Action(Delete和ClearAll)的菜单*/
2 popMenu_In_ListWidget_ = new QMenu(this);
3 action_Delete_In_ListWidget_ = new QAction(tr("Delete"), this);
4 action_Clear_In_ListWidget_ = new QAction(tr("ClearAll"), this);
5 popMenu_In_ListWidget_->addAction(action_Delete_In_ListWidget_);
6 popMenu_In_ListWidget_->addAction(action_Clear_In_ListWidget_);
第二步,设置QListWidget的contextMenuPolicy属性,不然不能显示右键菜单
1 /*重要:设置QListWidget的contextMenuPolicy属性,不然不能显示右键菜单*/
2 list_widget->setProperty("contextMenuPolicy", Qt::CustomContextMenu);
第二步,创建一个包含QAction的QMenu菜单
1 /*初始化一个包含两个Action(Delete和ClearAll)的菜单*/
2 popMenu_In_ListWidget_ = new QMenu(this);
3 action_Delete_In_ListWidget_ = new QAction(tr("Delete"), this);
4 action_Clear_In_ListWidget_ = new QAction(tr("ClearAll"), this);
5 popMenu_In_ListWidget_->addAction(action_Delete_In_ListWidget_);
6 popMenu_In_ListWidget_->addAction(action_Clear_In_ListWidget_);
第三步,为菜单的上的QAction添加响应函数
1 //事件处理函数
2 void Dialog::onActionDelete()
3 {
4 /*获取当前选中的Item*/
5 QList<QListWidgetItem*> items = this->list_widget->selectedItems();
6
7 if (items.count() > 0)
8 {
9 /*弹出询问对话框*/
10 if (QMessageBox::Yes == QMessageBox::question(this, QStringLiteral("Remove Item"),
11 QStringLiteral("Remove %1 item").arg(QString::number(items.count())), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
12 {
13 foreach(QListWidgetItem* var, items) {
14 this->list_widget->removeItemWidget(var);
15 items.removeOne(var);
16 delete var;
17 }
18 }
19 }
20 }
1 //绑定处理函数
2 /*为菜单上的Delete选项添加响应函数*/
3 connect(this->action_Delete_In_ListWidget_, SIGNAL(triggered()), this, SLOT(onActionDelete()));
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
第四步,为QListWidget添加右键弹出菜单函数
1 //事件处理函数
2 void Dialog::onCustomContextMenuRequested(const QPoint &pos)
3 {
4 /*弹出右键菜单*/
5 popMenu_In_ListWidget_->exec(QCursor::pos());
6 }
1 //绑定处理函数
2 /*绑定右键显示菜单:在单击右键之后会执行槽函数, 槽函数中负责弹出右键菜单*/
3 connect(this->list_widget, SIGNAL(customContextMenuRequested(const QPoint &)),
4 this, SLOT(onCustomContextMenuRequested(const QPoint &)));
CSDN QT大纲:Qt开发必备技术栈学习路线和资料
效果
鼠标右键点击,弹出菜单
点击Delete弹出是否删除对话框
代码示例
main_dialog.h
1 #include <QDialog>
2
3 class QMenu;
4 class QListWidget;
5
6 class Dialog : public QDialog
7 {
8 Q_OBJECT
9
10 public:
11 Dialog(QWidget* parent = NULL);
12 ~Dialog();
13
14 private slots:
15
16 /*处理鼠标右键事件,弹出菜单*/
17 void onCustomContextMenuRequested(const QPoint &pos);
18
19 /*处理弹出菜单上的Delete事件*/
20 void onActionDelete();
21
22 private:
23
24 QMenu *popMenu_In_ListWidget_;/*弹出菜单*/
25 QAction *action_Delete_In_ListWidget_;/*菜单上的Action*/
26 QAction *action_Clear_In_ListWidget_;/*菜单上的Action*/
27 QListWidget *list_widget;/*列表*/
28
29 };
main.cpp
1 #include <QtWidgets/QApplication>
2 #include <QListWidget>
3 #include <QMenu>
4 #include <QMessageBox>
5
6 #include "main_dialog.h"
7
8 Dialog::Dialog(QWidget *parent) :QDialog(parent)
9 {
10 /*设置对话框大小*/
11 this->setFixedSize(500, 400);
12
13 /*在对话框上添加一个QListWidget控件*/
14 list_widget = new QListWidget(this);
15 list_widget->setSelectionMode(QAbstractItemView::ContiguousSelection);/*设置可以多选*/
16
17 /*在QListWidget控件上添加两个Item*/
18 list_widget->addItem("this is 1th item");
19 list_widget->addItem("this is 2th item");
20
21 /*重要:设置QListWidget的contextMenuPolicy属性,不然不能显示右键菜单*/
22 list_widget->setProperty("contextMenuPolicy", Qt::CustomContextMenu);
23
24 /*初始化一个包含两个Action(Delete和ClearAll)的菜单*/
25 popMenu_In_ListWidget_ = new QMenu(this);
26 action_Delete_In_ListWidget_ = new QAction(tr("Delete"), this);
27 action_Clear_In_ListWidget_ = new QAction(tr("ClearAll"), this);
28 popMenu_In_ListWidget_->addAction(action_Delete_In_ListWidget_);
29 popMenu_In_ListWidget_->addAction(action_Clear_In_ListWidget_);
30
31 /*为菜单上的Delete选项添加响应函数*/
32 connect(this->action_Delete_In_ListWidget_, SIGNAL(triggered()), this, SLOT(onActionDelete()));
33
34 /*绑定右键显示菜单:在单击右键之后会执行槽函数, 槽函数中负责弹出右键菜单*/
35 connect(this->list_widget, SIGNAL(customContextMenuRequested(const QPoint &)),
36 this, SLOT(onCustomContextMenuRequested(const QPoint &)));
37
38 }
39 Dialog::~Dialog()
40 {
41
42 }
43
44 void Dialog::onCustomContextMenuRequested(const QPoint &pos)
45 {
46 /*弹出右键菜单*/
47 popMenu_In_ListWidget_->exec(QCursor::pos());
48 }
49
50 void Dialog::onActionDelete()
51 {
52 /*获取当前选中的Item*/
53 QList<QListWidgetItem*> items = this->list_widget->selectedItems();
54
55 if (items.count() > 0)
56 {
57 /*弹出询问对话框*/
58 if (QMessageBox::Yes == QMessageBox::question(this, QStringLiteral("Remove Item"),
59 QStringLiteral("Remove %1 item").arg(QString::number(items.count())), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
60 {
61 foreach(QListWidgetItem* var, items) {
62 this->list_widget->removeItemWidget(var);
63 items.removeOne(var);
64 delete var;
65 }
66 }
67 }
68 }
69
70 int main(int argc, char *argv[])
71 {
72 QApplication app(argc, argv);
73 Dialog dia;
74 dia.show();
75 return app.exec();
76 }
CMakeLists
1 cmake_minimum_required (VERSION 2.6 FATAL_ERROR)
2
3 project(QListWidget_Menu)
4 find_package (Qt5 REQUIRED Core Widgets)
5
6 set (QT_UI_HEADERS main_dialog.h)
7 QT5_WRAP_CPP (project_HEADERS_MOC ${QT_UI_HEADERS})
8
9 file(GLOB Demo_Src ./*.cpp)
10 set (project_SOURCES ${Demo_Src})
11
12 file(GLOB Demo_Header ./*.h)
13 set (INCLUDE_FILE ${Demo_Header} )
14
15 set (project_HEADERS ${INCLUDE_FILE} ${QT_UI_HEADERS})
16
17 ADD_DEFINITIONS (${QT_DEFINITIONS})
18 ADD_DEFINITIONS(-D _XKEYCHECK_H)
19 ADD_EXECUTABLE (Demo ${project_SOURCES} ${project_HEADERS_MOC} ${project_HEADERS})
20
21 set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT Demo)
22
23 TARGET_LINK_LIBRARIES (Demo Qt5::Core Qt5::Widgets)
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓