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

问题代码:

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对象已经被释放掉了。然后把代码改成下面这样:

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

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

相关推荐

  1. 菜单注册表位置

    2024-03-12 23:58:04       6 阅读
  2. notepad++绿色版添加菜单

    2024-03-12 23:58:04       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-12 23:58:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-12 23:58:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-12 23:58:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-12 23:58:04       20 阅读

热门阅读

  1. 单片机开发-实现Zigbee的LED灯交替闪烁

    2024-03-12 23:58:04       19 阅读
  2. 普通人改变命运的5次机会,你抓住了吗?

    2024-03-12 23:58:04       19 阅读
  3. vue的路由懒加载

    2024-03-12 23:58:04       20 阅读
  4. 【C++】每日一题 86 分隔链表

    2024-03-12 23:58:04       20 阅读
  5. 突破编程_C++_设计模式(迭代模式)

    2024-03-12 23:58:04       21 阅读
  6. 基于单片机的储油罐液位无线监测系统

    2024-03-12 23:58:04       25 阅读
  7. 【C++ 23种设计模式】

    2024-03-12 23:58:04       48 阅读
  8. leetcode 2386. 找出数组的第 K 大和【小根堆】

    2024-03-12 23:58:04       22 阅读
  9. DDR3 NATIVE接口

    2024-03-12 23:58:04       22 阅读