QListWidget右键弹出删除菜单

  • Post author:
  • Post category:其他




在QListWidget上右击鼠标弹出删除菜单



第一步,创建一个包含两条数据的QListWidget
	/*初始化一个包含两个Action(Delete和ClearAll)的菜单*/
	popMenu_In_ListWidget_ = new QMenu(this);
	action_Delete_In_ListWidget_ = new QAction(tr("Delete"), this);
	action_Clear_In_ListWidget_ = new QAction(tr("ClearAll"), this);
	popMenu_In_ListWidget_->addAction(action_Delete_In_ListWidget_);
	popMenu_In_ListWidget_->addAction(action_Clear_In_ListWidget_);

在这里插入图片描述



第二步,设置QListWidget的contextMenuPolicy属性,

不然不能显示右键菜单

	/*重要:设置QListWidget的contextMenuPolicy属性,不然不能显示右键菜单*/
	list_widget->setProperty("contextMenuPolicy", Qt::CustomContextMenu);


第二步,创建一个包含QAction的QMenu菜单
	/*初始化一个包含两个Action(Delete和ClearAll)的菜单*/
	popMenu_In_ListWidget_ = new QMenu(this);
	action_Delete_In_ListWidget_ = new QAction(tr("Delete"), this);
	action_Clear_In_ListWidget_ = new QAction(tr("ClearAll"), this);
	popMenu_In_ListWidget_->addAction(action_Delete_In_ListWidget_);
	popMenu_In_ListWidget_->addAction(action_Clear_In_ListWidget_);

在这里插入图片描述



第三步,为菜单的上的QAction添加响应函数
//事件处理函数
void Dialog::onActionDelete()
{
	/*获取当前选中的Item*/
	QList<QListWidgetItem*> items = this->list_widget->selectedItems();

	if (items.count() > 0)
	{
		/*弹出询问对话框*/
		if (QMessageBox::Yes == QMessageBox::question(this, QStringLiteral("Remove Item"),
			QStringLiteral("Remove %1 item").arg(QString::number(items.count())), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
		{
			foreach(QListWidgetItem* var, items) {
				this->list_widget->removeItemWidget(var);
				items.removeOne(var);
				delete var;
			}
		}
	}
}
//绑定处理函数
/*为菜单上的Delete选项添加响应函数*/
connect(this->action_Delete_In_ListWidget_, SIGNAL(triggered()), this, SLOT(onActionDelete()));


第四步,为QListWidget添加右键弹出菜单函数
//事件处理函数
void Dialog::onCustomContextMenuRequested(const QPoint &pos)
{
	/*弹出右键菜单*/
	popMenu_In_ListWidget_->exec(QCursor::pos());
}
//绑定处理函数
/*绑定右键显示菜单:在单击右键之后会执行槽函数, 槽函数中负责弹出右键菜单*/
connect(this->list_widget, SIGNAL(customContextMenuRequested(const QPoint &)),
	this, SLOT(onCustomContextMenuRequested(const QPoint &)));


效果

鼠标右键点击,弹出菜单

在这里插入图片描述

点击Delete弹出是否删除对话框

在这里插入图片描述



代码示例

main_dialog.h

#include <QDialog>

class QMenu;
class QListWidget;

class Dialog : public QDialog
{
	Q_OBJECT

public:
	Dialog(QWidget* parent = NULL);
	~Dialog();

	private slots:

	/*处理鼠标右键事件,弹出菜单*/
	void onCustomContextMenuRequested(const QPoint &pos);

	/*处理弹出菜单上的Delete事件*/
	void onActionDelete();

private:

	QMenu *popMenu_In_ListWidget_;/*弹出菜单*/
	QAction *action_Delete_In_ListWidget_;/*菜单上的Action*/
	QAction *action_Clear_In_ListWidget_;/*菜单上的Action*/
	QListWidget *list_widget;/*列表*/

};

main.cpp

#include <QtWidgets/QApplication>
#include <QListWidget>
#include <QMenu>
#include <QMessageBox>

#include "main_dialog.h"

Dialog::Dialog(QWidget *parent) :QDialog(parent)
{   
	/*设置对话框大小*/
	this->setFixedSize(500, 400);

	/*在对话框上添加一个QListWidget控件*/
	list_widget = new QListWidget(this);
	list_widget->setSelectionMode(QAbstractItemView::ContiguousSelection);/*设置可以多选*/

	/*在QListWidget控件上添加两个Item*/
	list_widget->addItem("this is 1th item");
	list_widget->addItem("this is 2th item");

	/*重要:设置QListWidget的contextMenuPolicy属性,不然不能显示右键菜单*/
	list_widget->setProperty("contextMenuPolicy", Qt::CustomContextMenu);

	/*初始化一个包含两个Action(Delete和ClearAll)的菜单*/
	popMenu_In_ListWidget_ = new QMenu(this);
	action_Delete_In_ListWidget_ = new QAction(tr("Delete"), this);
	action_Clear_In_ListWidget_ = new QAction(tr("ClearAll"), this);
	popMenu_In_ListWidget_->addAction(action_Delete_In_ListWidget_);
	popMenu_In_ListWidget_->addAction(action_Clear_In_ListWidget_);

	/*为菜单上的Delete选项添加响应函数*/
	connect(this->action_Delete_In_ListWidget_, SIGNAL(triggered()), this, SLOT(onActionDelete()));

	/*绑定右键显示菜单:在单击右键之后会执行槽函数, 槽函数中负责弹出右键菜单*/
	connect(this->list_widget, SIGNAL(customContextMenuRequested(const QPoint &)),
		this, SLOT(onCustomContextMenuRequested(const QPoint &)));

}
Dialog::~Dialog()
{

}

void Dialog::onCustomContextMenuRequested(const QPoint &pos)
{
	/*弹出右键菜单*/
	popMenu_In_ListWidget_->exec(QCursor::pos());
}

void Dialog::onActionDelete()
{
	/*获取当前选中的Item*/
	QList<QListWidgetItem*> items = this->list_widget->selectedItems();

	if (items.count() > 0)
	{
		/*弹出询问对话框*/
		if (QMessageBox::Yes == QMessageBox::question(this, QStringLiteral("Remove Item"),
			QStringLiteral("Remove %1 item").arg(QString::number(items.count())), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
		{
			foreach(QListWidgetItem* var, items) {
				this->list_widget->removeItemWidget(var);
				items.removeOne(var);
				delete var;
			}
		}
	}
}

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	Dialog dia;
	dia.show();
	return app.exec();
}

CMakeLists

cmake_minimum_required (VERSION 2.6 FATAL_ERROR)

project(QListWidget_Menu)
find_package (Qt5 REQUIRED Core Widgets)

set  (QT_UI_HEADERS main_dialog.h)
QT5_WRAP_CPP (project_HEADERS_MOC  ${QT_UI_HEADERS})

file(GLOB Demo_Src ./*.cpp)
set  (project_SOURCES ${Demo_Src})

file(GLOB Demo_Header ./*.h)
set  (INCLUDE_FILE ${Demo_Header} )

set  (project_HEADERS ${INCLUDE_FILE} ${QT_UI_HEADERS})

ADD_DEFINITIONS (${QT_DEFINITIONS})
ADD_DEFINITIONS(-D _XKEYCHECK_H)
ADD_EXECUTABLE  (Demo ${project_SOURCES} ${project_HEADERS_MOC} ${project_HEADERS})

set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT Demo)

TARGET_LINK_LIBRARIES (Demo Qt5::Core Qt5::Widgets)


参考资料


QListWidget右键菜单



Qt:QListWidget的item上实现右键菜单



版权声明:本文为qq_29022265原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。