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());
        }
    }
}

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

相关推荐
asom224 分钟前
Java 08集合
java·开发语言
xiaodage8 分钟前
mariadb-cenots8安装
数据库·mariadb
独行soc23 分钟前
2025年渗透测试面试题总结-安恒[实习]安全工程师(题目+回答)
运维·开发语言·经验分享·网络安全·面试·渗透测试·php
kokotao24 分钟前
使用Java实现Navicat密码的加密与解密
java·开发语言·数据库·mysql
c无序27 分钟前
【Go-2】基本语法与数据类型
开发语言·后端·golang
傻傻虎虎1 小时前
【QT】ModbusTCP读写寄存器类封装
开发语言·数据库·qt
独行soc1 小时前
2025年渗透测试面试题总结-华顺信安[实习]安全服务工程师(题目+回答)
运维·开发语言·学习·安全·面试·渗透测试·php
王RuaRua1 小时前
[数据结构]6. 队列-Queue
开发语言·数据结构·算法·leetcode
敲键盘的小夜猫1 小时前
如何理解大模型的幻觉输出及RAG技术的应用与实战案例
开发语言·python
STONE_KKK1 小时前
Django快速入门篇
数据库·django·sqlite