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

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

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

最后不要忘记点击保存。


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

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

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


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



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对象代表一个列表项,可以包含图标和文本。QIcon类用来加载和表示图标,图标的路径是从资源文件中加载的(":/demo12_listwidget/resources/..."是指向Qt资源系统中的路径)。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);
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函数会被触发,菜单会弹出。最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!