如何在 QGraphicsView 中创建右键单击的上下文菜单
How to create a context menu for right click in QGraphicsView
我使用 Qt creator 中的设计器创建了一个图形视图。
层次结构如下:
当我在图形视图区域中单击鼠标右键时,没有任何反应(据我所知这是默认行为)。由于我试图在右键单击时显示下拉菜单,但我无法让它工作,所以我添加了一个连接和自定义插槽。
这是我的代码:
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);
...
}
以及调用处理菜单的槽函数:
`
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);
}
`
问题(个):
每次右键单击时,qdebug 字符串都会在我的控制台上打印两次,为什么会这样?它应该只出现一次...
我正在我的场景中绘制 Qgraphicsitems,on_graphView_customContextMenuRequested 似乎在我右键单击绘制的项目时被触发,而不仅仅是场景中的空白 space ,我如何让它只针对 graphview 触发,在顶部没有任何东西的区域(场景上没有项目覆盖)。
pos 中的坐标是相对于 graphview 尺寸的,因此当我在上面的代码中取消注释 menu.exec
时,菜单显示在错误的位置。如何将我的 pos 转换为相对于整个 Windows 而不仅仅是图形视图的全局坐标。
解释:
它获得 2 次展示,因为 on_graphView_customContextMenuRequested 槽被调用 2 次,因为有 2 个连接。第一个连接是使用 QtDesigner 创建的,它使用 uic 工具生成 C++ 代码,使用 .ui,如果插槽的名称符合 [=11=,则此连接是自动的] 规则(参见 this),第二个连接是您在代码中显示的连接。有几种选择:
1.1 更改插槽名称。
1.2 删除您显示的连接。
无论是否有item,customContextMenuRequested信号都会发出,这种情况下的解决方案是过滤是否有item。
exec() 方法必须使用全局位置,但 customContextMenuRequested 信号传递相对于发出信号的小部件的位置,因此您必须将其转换为全局位置。
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));
}
我使用 Qt creator 中的设计器创建了一个图形视图。
层次结构如下:
当我在图形视图区域中单击鼠标右键时,没有任何反应(据我所知这是默认行为)。由于我试图在右键单击时显示下拉菜单,但我无法让它工作,所以我添加了一个连接和自定义插槽。
这是我的代码:
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);
...
}
以及调用处理菜单的槽函数:
`
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);
}
`
问题(个):
每次右键单击时,qdebug 字符串都会在我的控制台上打印两次,为什么会这样?它应该只出现一次...
我正在我的场景中绘制 Qgraphicsitems,on_graphView_customContextMenuRequested 似乎在我右键单击绘制的项目时被触发,而不仅仅是场景中的空白 space ,我如何让它只针对 graphview 触发,在顶部没有任何东西的区域(场景上没有项目覆盖)。
pos 中的坐标是相对于 graphview 尺寸的,因此当我在上面的代码中取消注释
menu.exec
时,菜单显示在错误的位置。如何将我的 pos 转换为相对于整个 Windows 而不仅仅是图形视图的全局坐标。
解释:
它获得 2 次展示,因为 on_graphView_customContextMenuRequested 槽被调用 2 次,因为有 2 个连接。第一个连接是使用 QtDesigner 创建的,它使用 uic 工具生成 C++ 代码,使用 .ui,如果插槽的名称符合 [=11=,则此连接是自动的] 规则(参见 this),第二个连接是您在代码中显示的连接。有几种选择:
1.1 更改插槽名称。
1.2 删除您显示的连接。
无论是否有item,customContextMenuRequested信号都会发出,这种情况下的解决方案是过滤是否有item。
exec() 方法必须使用全局位置,但 customContextMenuRequested 信号传递相对于发出信号的小部件的位置,因此您必须将其转换为全局位置。
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));
}