繁体   English   中英

如何在 QGraphicsView 中为右键单击创建上下文菜单

[英]How to create a context menu for right click in QGraphicsView

我使用 Qt creator 中的设计器创建了一个图形视图。

层次结构如下:

在此处输入图像描述

当我在图形视图区域中单击鼠标右键时,什么也没有发生(这是默认行为 afaik)。 由于我试图在右键单击时显示一个下拉菜单,但我无法让它工作,我添加了一个连接和自定义插槽。

这是我的代码:


MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   MainWindow:: makePlot();
=
   ui->graphView->setContextMenuPolicy(Qt::CustomContextMenu);
   
   QObject::connect(ui->graphView ,SIGNAL(customContextMenuRequested(const QPoint &)),this,SLOT(on_graphView_customContextMenuRequested(const QPoint &)));
   scene = new QGraphicsScene();
   ui->graphView->setScene(scene);
...
}

以及调用来处理菜单的插槽 function:

`

void MainWindow::on_graphView_customContextMenuRequested(const QPoint &pos)
{

    qDebug() << " custom menuu!!!!!!!!!"<<  "##"<< pos.x() << "  ;  "<< pos.y();
//    QMenu menu(this);
//        menu.addAction("...1");
//        menu.addAction("...2");
//        menu.exec(pos);
}

`

问题:

  1. 每次右键单击时,qdebug 字符串都会在我的控制台上打印两次,为什么会这样? 它应该只出现一次...

  2. 我在我的场景上绘制 Qgraphicsitems,on_graphView_customContextMenuRequested 似乎被触发,即使我右键单击一个绘制的项目,而不仅仅是场景中的空白区域,我如何让它只为 graphview 触发,在顶部没有任何东西的区域(场景上没有项目覆盖)。

  3. pos 中的坐标是相对于 graphview 尺寸的,因此当我在上面的代码中取消注释menu.exec时,菜单显示在错误的位置。 如何将我的 pos 转换为相对于整个 Windows 而不仅仅是图形视图的全局坐标。

解释:

  1. 它获得 2 次展示,因为 on_graphView_customContextMenuRequested 插槽被调用了 2 次,因为有 2 个连接。 第一个连接是使用 QtDesigner 建立的,使用 uic 工具生成 C++ 代码,使用 .ui,如果插槽名称符合void on_<object name>_<signal name>(<signal parameters>); 规则(参见this ),第二个连接是您在代码中显示的连接。 有几种选择:

    1.1 更改插槽的名称。

    1.2 删除您显示的连接。

  2. customContextMenuRequested 信号无论是否有项目都会发出,这种情况下的解决方案是过滤是否有项目。

  3. exec() 方法必须使用全局 position 但 customContextMenuRequested 信号通过 position 相对于发出信号的小部件,因此您必须将其转换为全局 Z4757FE07FD492A8BEEZEA6A760D683D6。

MWE:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->graphView->setContextMenuPolicy(Qt::CustomContextMenu);
    scene = new QGraphicsScene();
    ui->graphView->setScene(scene);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_graphView_customContextMenuRequested(const QPoint &pos)
{
    if(ui->graphView->itemAt(pos))
        return;
    QMenu menu(this);
    menu.addAction("...1");
    menu.addAction("...2");
    menu.exec(ui->graphView->mapToGlobal(pos));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM