Qt QListWidget右键弹出删除菜单

在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()));
第四步,为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 &)));
效果

鼠标右键点击,弹出菜单
在这里插入图片描述
点击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)
原文地址:https://www.cnblogs.com/ybqjymy/p/13890696.html