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

19 篇文章 1 订阅
6 篇文章 1 订阅

问题代码:

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

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

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`customContextMenuRequested(QPoint)`是`QWidget`类中的一个信号,表示当用户请求在窗口中创建一个自定义上下文菜单时,该信号将被触发。信号带有一个`QPoint`参数,表示鼠标指针的位置。通过连接`customContextMenuRequested(QPoint)`信号和一个槽函数,可以在窗口上创建自定义的上下文菜单,并在指定位置显示菜单。例如,可以在窗口上创建一个`QMenu`对象,并将其与`QWidget`的`mapToGlobal()`函数一起使用,将菜单显示在鼠标指针的位置上。 下面是一个使用`customContextMenuRequested(QPoint)`信号的示例: ```cpp void MyWidget::contextMenuEvent(QContextMenuEvent *event) { QMenu menu(this); // 创建一个菜单对象 QAction *action1 = menu.addAction("Action 1"); QAction *action2 = menu.addAction("Action 2"); QAction *selectedAction = menu.exec(event->globalPos()); // 在指定位置显示菜单,并等待用户选择 if (selectedAction == action1) { // 如果用户选择了Action 1 // 执行相应的操作 } else if (selectedAction == action2) { // 如果用户选择了Action 2 // 执行相应的操作 } } void MyWidget::onCustomContextMenuRequested(const QPoint &pos) { contextMenuEvent(new QContextMenuEvent(QContextMenuEvent::Reason::Other, pos)); // 触发上下文菜单事件 } ``` 在上面的代码中,我们重载了`QWidget`的`contextMenuEvent(QContextMenuEvent *event)`函数,在该函数中创建了一个`QMenu`对象,并调用`menu.exec(event->globalPos())`在鼠标指针的位置上显示菜单,并等待用户选择。然后,我们又定义了一个槽函数`onCustomContextMenuRequested(const QPoint &pos)`,该函数接收一个`QPoint`参数,表示鼠标指针的位置。在该槽函数中,我们调用`contextMenuEvent()`函数触发上下文菜单事件,并传递鼠标指针的位置作为参数。这样,当用户请求在窗口中创建一个自定义上下文菜单时,`customContextMenuRequested(QPoint)`信号将被触发,并调用`onCustomContextMenuRequested(const QPoint &pos)`槽函数,从而在指定位置创建自定义的上下文菜单

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值