创建项目,添加资源文件
在项目文件夹中创建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
类来向一个列表控件中添加带图标和文字的项目。具体解释如下:
- QListWidgetItem: 每一个
QListWidgetItem
对象代表一个列表项,可以包含图标和文本。 - QIcon:
QIcon
类用来加载和表示图标,图标的路径是从资源文件中加载的(":/demo12_listwidget/resources/..."
是指向Qt资源系统中的路径)。 - 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
添加到一个名为listWidget
的QListWidget
控件中。这个控件在用户界面中用来显示这些带图标和文本的列表项。
初始化函数
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
函数用于连接信号与槽。当pAc1
的triggered
信号被触发(即当用户点击“动作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
函数将listWidget
的customContextMenuRequested
信号与demo12_listwidget::on_PopupRightMenu
槽函数连接起来。customContextMenuRequested
信号:这是当用户右键单击时,QListWidget
发出的信号,传递右键单击的相对位置QPoint
。- 槽函数
on_PopupRightMenu
:这是一个自定义的函数,用于在指定位置弹出右键菜单(该函数在之前的代码中已定义)。 - 这样,当用户在
listWidget
中右键点击时,on_PopupRightMenu
函数会被触发,菜单会弹出。
结尾
最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!