【二十】【QT开发应用】listwidget右键菜单和删除item

创建项目,添加资源文件

在项目文件夹中创建resources资源文件夹。

在vs中打开qrc文件,选择添加资源文件。

选择我们resources资源文件中的所有文件作为资源文件。

最后不要忘记点击保存。

向ListWidget控件添加item

右键菜单

在.h文件中添加QMenu头文件,右键菜单初始化函数,以及槽函数弹出右键菜单,和右键菜单对应的指针。

编写还初始化函数和槽函数。

调用初始化函数和连接信号和信号槽。

连接菜单中的信号和槽函数。


复盘

向listwidget控件添加item项

cpp 复制代码
    QListWidgetItem* pItem1 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/kits.png"), u8"Kits");
    QListWidgetItem* pItem2 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/env.png"), u8"环境");
    QListWidgetItem* pItem3 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/editor.png"), u8"编辑器");
    QListWidgetItem* pItem4 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/vim.png"), u8"Fakevim");
    QListWidgetItem* pItem5 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/help.png"), u8"帮助");

    ui.listWidget->addItem(pItem1);
    ui.listWidget->addItem(pItem2);
    ui.listWidget->addItem(pItem3);
    ui.listWidget->addItem(pItem4);
    ui.listWidget->addItem(pItem5);

这段代码使用了Qt框架中的QListWidgetItem类来向一个列表控件中添加带图标和文字的项目。具体解释如下:

  1. QListWidgetItem : 每一个QListWidgetItem对象代表一个列表项,可以包含图标和文本。
  2. QIcon : QIcon类用来加载和表示图标,图标的路径是从资源文件中加载的(":/demo12_listwidget/resources/..."是指向Qt资源系统中的路径)。
  3. u8"...": 这个前缀表示字符串是以UTF-8编码的。这种编码方式可以用于处理多语言文本(如中文的"环境"和"帮助")。
cpp 复制代码
QListWidgetItem* pItem1 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/kits.png"), u8"Kits");
  • 创建了一个新的QListWidgetItem对象,带有一个图标(路径为resources/kits.png)和文本"Kits"。
cpp 复制代码
QListWidgetItem* pItem2 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/env.png"), u8"环境");
  • 创建了另一个QListWidgetItem对象,图标来自resources/env.png,文本为"环境"(中文)。
cpp 复制代码
QListWidgetItem* pItem3 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/editor.png"), u8"编辑器");
  • 再次创建一个QListWidgetItem对象,图标为resources/editor.png,文本是"编辑器"。
cpp 复制代码
QListWidgetItem* pItem4 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/vim.png"), u8"Fakevim");
  • 创建了一个图标为resources/vim.png,文本为"Fakevim"的项目。
cpp 复制代码
QListWidgetItem* pItem5 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/help.png"), u8"帮助");
  • 创建了一个带有resources/help.png图标和"帮助"文本的列表项。
cpp 复制代码
ui.listWidget->addItem(pItem1);
ui.listWidget->addItem(pItem2);
ui.listWidget->addItem(pItem3);
ui.listWidget->addItem(pItem4);
ui.listWidget->addItem(pItem5);
  • 依次将上面创建的5个QListWidgetItem添加到一个名为listWidgetQListWidget控件中。这个控件在用户界面中用来显示这些带图标和文本的列表项。

初始化函数

cpp 复制代码
void demo12_listwidget::initRightMenu() {

	m_pRightMenu = new QMenu(this);

	QAction* pAc1 = new QAction(u8"动作1", this);
	QAction* pAc2 = new QAction(u8"动作2", this);
	QAction* pAc3 = new QAction(u8"动作3", this);
	QAction* pAc4 = new QAction(u8"删除", this);

	m_pRightMenu->addAction(pAc1);
	m_pRightMenu->addAction(pAc2);
	m_pRightMenu->addAction(pAc3);
	m_pRightMenu->addAction(pAc4);


    connect(pAc1, &QAction::triggered, [=] {
        QMessageBox::information(this, "title", "ac1");
        });

    connect(pAc4, &QAction::triggered, [=] {
		QListWidgetItem* item = ui.listWidget->currentItem();
		ui.listWidget->removeItemWidget(item);
		delete item;
        });
}

这段代码的作用是在Qt应用程序中为一个列表控件创建并初始化右键菜单,同时为其中的几个动作(QAction)设置相应的处理逻辑。

cpp 复制代码
void demo12_listwidget::initRightMenu() {
    m_pRightMenu = new QMenu(this);
  • 定义了一个名为initRightMenu的成员函数,用来初始化右键菜单。
  • m_pRightMenu是一个指向QMenu对象的指针,表示右键菜单,并通过new QMenu(this)创建了新的菜单对象,this表示当前窗口作为父对象,确保内存管理。
cpp 复制代码
    QAction* pAc1 = new QAction(u8"动作1", this);
    QAction* pAc2 = new QAction(u8"动作2", this);
    QAction* pAc3 = new QAction(u8"动作3", this);
    QAction* pAc4 = new QAction(u8"删除", this);
  • 这里创建了四个QAction对象,分别对应右键菜单中的四个选项。u8"动作1"等表示菜单项的文本,其中前三项为通用动作,第四项"删除"是一个专门用于删除选项的动作。this表示这些QAction的父对象是当前窗口。
cpp 复制代码
    m_pRightMenu->addAction(pAc1);
    m_pRightMenu->addAction(pAc2);
    m_pRightMenu->addAction(pAc3);
    m_pRightMenu->addAction(pAc4);
  • 使用addAction函数将四个QAction对象添加到右键菜单m_pRightMenu中。这会让这些动作在右键点击时出现在菜单中。

信号与槽连接:

cpp 复制代码
    connect(pAc1, &QAction::triggered, [=] {
        QMessageBox::information(this, "title", "ac1");
    });
  • connect函数用于连接信号与槽。当pAc1triggered信号被触发(即当用户点击"动作1"时),会执行匿名lambda函数。在该函数内,QMessageBox::information弹出一个消息框,显示标题为"title",内容为"ac1"的信息。
cpp 复制代码
    connect(pAc4, &QAction::triggered, [=] {
        QListWidgetItem* item = ui.listWidget->currentItem();
        ui.listWidget->removeItemWidget(item);
        delete item;
    });
  • 当用户点击"删除"(pAc4)菜单项时,会触发这个匿名函数。
  • ui.listWidget->currentItem():获取当前选中的列表项。
  • ui.listWidget->removeItemWidget(item):将该项目从列表控件中移除。
  • delete item:从内存中删除该项目,防止内存泄漏。

弹出右键菜单函数

cpp 复制代码
void demo12_listwidget::on_PopupRightMenu(const QPoint& pos) {
    QListWidgetItem* pItem = ui.listWidget->itemAt(pos);
	if (!pItem) return;


	m_pRightMenu->exec(QCursor::pos());
}

这段代码的功能是当用户在QListWidget中右键单击时,弹出一个右键菜单。

cpp 复制代码
void demo12_listwidget::on_PopupRightMenu(const QPoint& pos) {
  • 这是一个名为on_PopupRightMenu的成员函数,接收一个QPoint类型的参数pos,表示鼠标点击的相对位置。
  • 该函数是一个槽函数,用于响应右键单击的信号,从而在指定位置弹出右键菜单。
cpp 复制代码
    QListWidgetItem* pItem = ui.listWidget->itemAt(pos);
  • ui.listWidget->itemAt(pos):使用这个函数从listWidget中获取用户单击位置的QListWidgetItem对象。
  • pos是鼠标单击的位置,itemAt根据这个位置返回对应的列表项。如果用户点击的地方没有列表项,那么pItem将会是nullptr
cpp 复制代码
    if (!pItem) return;
  • 这里进行空指针检查。如果在用户点击的位置没有任何列表项(即pItem == nullptr),则函数直接返回,不进行后续的菜单弹出操作。
cpp 复制代码
    m_pRightMenu->exec(QCursor::pos());
  • 如果用户点击的位置有对应的列表项,则执行这行代码来弹出右键菜单。
  • m_pRightMenu->exec()用于显示菜单,QCursor::pos()返回当前鼠标的全局屏幕坐标,确保菜单在鼠标所在的位置弹出。

设置菜单策略,连接弹出菜单的信号和槽函数

cpp 复制代码
    ui.listWidget->setContextMenuPolicy(Qt::CustomContextMenu);

    connect(ui.listWidget, &QListWidget::customContextMenuRequested, this, &demo12_listwidget::on_PopupRightMenu);

这段代码的作用是为QListWidget控件设置自定义的右键菜单触发机制,并连接相应的槽函数,以便在用户右键单击时弹出菜单。

cpp 复制代码
ui.listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
  • 这行代码为listWidget设置了上下文菜单策略。
  • Qt::CustomContextMenu:表示使用自定义的上下文菜单。这意味着当用户右键点击时,不会显示默认的上下文菜单,而是触发一个信号,开发者可以捕获这个信号并定义自定义的菜单行为。
cpp 复制代码
connect(ui.listWidget, &QListWidget::customContextMenuRequested, this, &demo12_listwidget::on_PopupRightMenu);
  • connect函数将listWidgetcustomContextMenuRequested信号与demo12_listwidget::on_PopupRightMenu槽函数连接起来。
    • customContextMenuRequested信号 :这是当用户右键单击时,QListWidget发出的信号,传递右键单击的相对位置QPoint
    • 槽函数on_PopupRightMenu:这是一个自定义的函数,用于在指定位置弹出右键菜单(该函数在之前的代码中已定义)。
    • 这样,当用户在listWidget中右键点击时,on_PopupRightMenu函数会被触发,菜单会弹出。

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

相关推荐
工业甲酰苯胺20 分钟前
Redis性能优化的18招
数据库·redis·性能优化
没书读了1 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
----云烟----1 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024061 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic2 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it2 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
i道i2 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl2 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
武子康2 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
wqq_9922502772 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序