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

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

相关推荐
qq_283720058 分钟前
Qt QML 中为 CheckBox 设置鸿蒙字体(HarmonyOS Sans)——适配 Qt 5.6.x 与 Qt 5.12+
开发语言·qt·harmonyos
未知鱼14 分钟前
Python安全开发之简易目录扫描器(含详细注释)
开发语言·python·安全
左左右右左右摇晃33 分钟前
Java并发——死锁
java·开发语言·spring
小白橘颂34 分钟前
【C语言】基础概念梳理(一)
c语言·开发语言·stm32·单片机·mcu·物联网·51单片机
沫离痕35 分钟前
AI机器人客服-Dify接入
开发语言·javascript·ecmascript
半瓶榴莲奶^_^1 小时前
java模式
java·开发语言
sword devil9001 小时前
TRAE:agent团队
开发语言
co_wait1 小时前
【c 语言】linux下gcc编译工具的使用
linux·c语言·开发语言
2301_815482931 小时前
C++编译期矩阵运算
开发语言·c++·算法
Sunshine for you1 小时前
如何用FastAPI构建高性能的现代API
jvm·数据库·python