Qt设置右键菜单无效customContextMenuRequested(const QPoint &pos)

问题代码:

cpp 复制代码
void MainWindow::onCustomContextMenuRequested(const QPoint &pos)
{
    QTreeWidgetItem *item = ui->treeWidget->itemAt(pos);
    if (item)
    {
        QMenu menu(ui->treeWidget);
        TreeNodeType nodeType = (TreeNodeType)item->data(0, Qt::UserRole + 1).toInt();
        if (nodeType == NODE_CONNECTION)
        {
            QAction actionOpen("打开连接", ui->treeWidget);
            connect(&actionOpen, &QAction::triggered, this, &MainWindow::onOpenConnectionTriggered);
            menu.addAction(&actionOpen);
            QAction actionModify("编辑连接", ui->treeWidget);
            connect(&actionModify, &QAction::triggered, this, &MainWindow::onModifyConnectionTriggered);
            menu.addAction(&actionModify);
        }
        else if (nodeType == NODE_DATABASE)
        {
            qDebug() << "NODE_DATABASE";
            QAction actionOpen("打开连接", ui->treeWidget);
            connect(&actionOpen, &QAction::triggered, this, &MainWindow::onOpenConnectionTriggered);
            menu.addAction(&actionOpen);
        }
        else if (nodeType == NODE_TABLE)
        {
            qDebug() << "NODE_TABLE";
            QAction actionOpen("打开连接", ui->treeWidget);
            connect(&actionOpen, &QAction::triggered, this, &MainWindow::onOpenConnectionTriggered);
            menu.addAction(&actionOpen);
        }

        qDebug() << "why?";
        menu.exec(QCursor::pos());
    }
}

想着先声明QMenu然后根据右键的不同类型节点弹出不一样的菜单,结果这样一直无法显示菜单。调试发现代码是按照预想的逻辑走的,后面想起一种可能:QAction在if里面定义,离开if的时候,QAction对象已经被释放掉了。然后把代码改成下面这样:

cpp 复制代码
void MainWindow::onCustomContextMenuRequested(const QPoint &pos)
{
    QTreeWidgetItem *item = ui->treeWidget->itemAt(pos);
    if (item)
    {
        TreeNodeType nodeType = (TreeNodeType)item->data(0, Qt::UserRole + 1).toInt();
        if (nodeType == NODE_CONNECTION)
        {
            QMenu menu(ui->treeWidget);
            QAction actionOpen("打开连接", ui->treeWidget);
            connect(&actionOpen, &QAction::triggered, this, &MainWindow::onOpenConnectionTriggered);
            menu.addAction(&actionOpen);
            QAction actionModify("编辑连接", ui->treeWidget);
            connect(&actionModify, &QAction::triggered, this, &MainWindow::onModifyConnectionTriggered);
            menu.addAction(&actionModify);
            menu.exec(QCursor::pos());
        }
        else if (nodeType == NODE_DATABASE)
        {
            QMenu menu(ui->treeWidget);
            qDebug() << "NODE_DATABASE";
            QAction actionOpen("打开连接", ui->treeWidget);
            connect(&actionOpen, &QAction::triggered, this, &MainWindow::onOpenConnectionTriggered);
            menu.addAction(&actionOpen);
            menu.exec(QCursor::pos());
        }
        else if (nodeType == NODE_TABLE)
        {
            QMenu menu(ui->treeWidget);
            qDebug() << "NODE_TABLE";
            QAction actionOpen("打开连接", ui->treeWidget);
            connect(&actionOpen, &QAction::triggered, this, &MainWindow::onOpenConnectionTriggered);
            menu.addAction(&actionOpen);
            menu.exec(QCursor::pos());
        }
    }
}

再次运行,果然没问题了,又学到了。

相关推荐
努力努力再努力wz8 小时前
【Lua入门系列】从 Table 到元表与元方法:一文理解 Lua 的行为扩展机制
开发语言·junit·lua
凤凰院凶涛QAQ9 小时前
《MySQL内核拆解:从SQL到InnoDB》(三) : 数据库设计 & 聚合查询 & 分组查询
数据库·sql·mysql
qq_406981039 小时前
什么是顶层 const什么是底层const
开发语言·c++
Eider19989 小时前
python基础语法之并发基础练习
开发语言·python
#麻辣小龙虾#9 小时前
网页布局css中flex+margin的组合布局技巧
开发语言·前端·javascript
云和数据.ChenGuang9 小时前
python和java的try
java·开发语言·python
我是唐青枫9 小时前
Kotlin Inheritance(继承)详解:语法、原理、实战 Demo
开发语言·kotlin
ly76899 小时前
从 OpenAPI 到多语言 SDK 生成:Java 服务端契约漂移与生成器版本治理
java·开发语言·openapi·java 21·版本兼容·契约漂移·sdk 生成
lqbzlll9 小时前
CVE-2026-91403 排查指南:Java JSSE 信任链漏洞的根因、影响范围和修复步骤
java·开发语言·信任链
CarIise9 小时前
AOP 概念的引入
java·开发语言