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


    创建项目,添加资源文件

    在这里插入图片描述
    在项目文件夹中创建resources资源文件夹。
    在这里插入图片描述
    在vs中打开qrc文件,选择添加资源文件。
    在这里插入图片描述
    选择我们resources资源文件中的所有文件作为资源文件。
    在这里插入图片描述
    最后不要忘记点击保存。
    在这里插入图片描述

    向ListWidget控件添加item

    在这里插入图片描述

    右键菜单

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

    在这里插入图片描述
    编写还初始化函数和槽函数。
    在这里插入图片描述
    调用初始化函数和连接信号和信号槽。
    在这里插入图片描述
    在这里插入图片描述

    连接菜单中的信号和槽函数。
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    复盘

    向listwidget控件添加item项

        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编码的。这种编码方式可以用于处理多语言文本(如中文的"环境"和"帮助")。
    QListWidgetItem* pItem1 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/kits.png"), u8"Kits");
    
    • 创建了一个新的QListWidgetItem对象,带有一个图标(路径为resources/kits.png)和文本“Kits”。
    QListWidgetItem* pItem2 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/env.png"), u8"环境");
    
    • 创建了另一个QListWidgetItem对象,图标来自resources/env.png,文本为“环境”(中文)。
    QListWidgetItem* pItem3 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/editor.png"), u8"编辑器");
    
    • 再次创建一个QListWidgetItem对象,图标为resources/editor.png,文本是“编辑器”。
    QListWidgetItem* pItem4 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/vim.png"), u8"Fakevim");
    
    • 创建了一个图标为resources/vim.png,文本为“Fakevim”的项目。
    QListWidgetItem* pItem5 = new QListWidgetItem(QIcon(":/demo12_listwidget/resources/help.png"), u8"帮助");
    
    • 创建了一个带有resources/help.png图标和“帮助”文本的列表项。
    ui.listWidget->addItem(pItem1);
    ui.listWidget->addItem(pItem2);
    ui.listWidget->addItem(pItem3);
    ui.listWidget->addItem(pItem4);
    ui.listWidget->addItem(pItem5);
    
    • 依次将上面创建的5个QListWidgetItem添加到一个名为listWidgetQListWidget控件中。这个控件在用户界面中用来显示这些带图标和文本的列表项。

    初始化函数

    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)设置相应的处理逻辑。

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

    信号与槽连接:

        connect(pAc1, &QAction::triggered, [=] {
            QMessageBox::information(this, "title", "ac1");
        });
    
    • connect函数用于连接信号与槽。当pAc1triggered信号被触发(即当用户点击“动作1”时),会执行匿名lambda函数。在该函数内,QMessageBox::information弹出一个消息框,显示标题为"title",内容为"ac1"的信息。
        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:从内存中删除该项目,防止内存泄漏。

    弹出右键菜单函数

    void demo12_listwidget::on_PopupRightMenu(const QPoint& pos) {
        QListWidgetItem* pItem = ui.listWidget->itemAt(pos);
    	if (!pItem) return;
    
    
    	m_pRightMenu->exec(QCursor::pos());
    }
    

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

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

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

        ui.listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    
        connect(ui.listWidget, &QListWidget::customContextMenuRequested, this, &demo12_listwidget::on_PopupRightMenu);
    

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

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

    结尾

    最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
    同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
    谢谢您的支持,期待与您在下一篇文章中再次相遇!

  • 相关阅读:
    Ubuntu20.04.6新系统没有wifi驱动(已解决)
    小程序--独立分包&分包预下载
    深耕全面预算管理 拥抱企业数字未来
    课题学习(六)----安装误差校准、实验方法
    智能化新十年,“全栈智能”定义行业“Copilot智能助手”
    一体式水利视频监控站 遥测终端视频图像水位水质水量流速监测
    manyspeech-cli 本地命令行语音识别工具
    [Python] Django ORM与执行原生SQL实现操作数据库
    三种内存分配的库比较
    数字孪生与智慧城市:开启未来智慧生活
  • 原文地址:https://blog.csdn.net/m0_74163972/article/details/142209406