有时需要为 QTreeWidget 的子条目添加右键菜单功能,主要有两种方案来实现:
方案一
该方案比较通用,通过为 QTreeWidget 建立信号槽,在接受 itemPressed
的信号时会被触发,然后判断当前是否为鼠标右键,
若为鼠标右键则创建添加对应的菜单栏,并提供相应的功能。
// 1. QTreeWidget* tree 为树 tree 创建信号槽,鼠标press时会触发对应的信号。
connect(tree, &QTreeWidget::itemPressed, this, &Demo01_GUI::OnRightButtonClicked);
// 2. 槽函数来创建右键菜单,并处理对应的事件功能。
void Demo01_GUI::OnRightButtonClicked(QTreeWidgetItem* item, int column)
{
if(qApp->mouseButtons() == Qt::RightButton) // 只针对鼠标右键
{
QTreeWidget* tree = item->treeWidget(); // 获取当前item所在的QTreeWidget
// [option] 此处可以添加条件来只针对指定的QTreeWidgetItem来添加右键菜单功能。
QMenu* menu = new QMenu(tree);
QAction* action1 = new QAction("open folder");
QAction* action2 = new QAction("edit file");
menu->addAction(action1);
menu->addAction(action2);
// 为右键菜单上的QAction创建信号槽,添加对应的功能
connect(action1, &QAction::triggered, this, [ = ]
{
QMessageBox::warning(this, "Action", "Open folder");
});
connect(action2, &QAction::triggered, this, [ = ]
{
QMessageBox::warning(this, "Action", "edit file");
});
// 右键菜单在鼠标点击的位置显示
menu->exec(QCursor::pos());
}
}
其右键菜单效果如下图所示:
方案二
该方案通过 QTreeWidget::customContextMenuRequested
信号来触发并显示对应的菜单栏功能,使用该信号之前需要先调用 setContextMenuPolicy(Qt::CustomContextMenu)
来设置 ContextMenuPolicy 为自定义菜单栏 Qt::CustomContextMenu,然后才可以在右键时直接触发对应的事件。
// 1. 设置菜单文本的策略为自定义
tree->setContextMenuPolicy(Qt::CustomContextMenu);
// 2. 为QTreeWidget的对象指针 tree 创建信号槽,来接受处理右键事件。
connect(tree, &QTreeWidget::customContextMenuRequested, this, &Demo01_GUI::OnRightClicked);
/// <summary>
/// 该槽函数的参数为鼠标右键时的坐标点
/// </summary>
/// <param name="point"></param>
void Demo01_GUI::OnRightClicked(const QPoint& point)
{
QTreeWidget* curTree = qobject_cast<QTreeWidget*>(sender());
QTreeWidgetItem* item = curTree->itemAt(point);
QMenu* menu = new QMenu(curTree);
menu->addAction(new QAction("MyAction0001"));
menu->addAction(new QAction("MyAction0004"));
menu->addAction(new QAction("MyAction0006"));
menu->exec(QCursor::pos());
}
以上两种方案都可以实现右键菜单功能,一般方案一更具有通用性,其实现逻辑也更容易理解。
标签:菜单,menu,tree,右键,QTreeWidget,QAction From: https://www.cnblogs.com/Jeffxu/p/17797975.html