QTreeWidget 添加右键菜单

发布时间 2023-10-30 15:31:59作者: Jeffxue

有时需要为 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());
}


以上两种方案都可以实现右键菜单功能,一般方案一更具有通用性,其实现逻辑也更容易理解。