zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    struts.xml配置详解 内部资料 请勿转载 谢谢合作
    Struts框架2ActionError类 内部资料 请勿转载 谢谢合作
    Struts框架 内部资料 请勿转载 谢谢合作
    JDBC 内部资料 请勿转载 谢谢合作
    JSP 实现◆菱形 三角形△ 的输出
    JSP实现 乘法口诀输出
    GUID 全局统一标识符的介绍
    Java 基础 Map 练习题
    Java 异常处理 练习2
    Java 异常处理
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13890696.html
Copyright © 2011-2022 走看看