在QGraphicsScene点击或右击时显示弹出菜单

9
有没有一种方法可以在用户右键单击场景的空白部分时显示弹出窗口?
我是Qt的新手,我尝试过使用槽和子类化,但都没有成功。
不存在这样的槽函数和相应的错误:“QMouseEvent未声明”,当尝试实现“onMouseRelease”事件时。
2个回答

13

你可以重新实现 QGraphicsScene 类的 contextMenuEvent 方法,这将使你可以访问场景坐标以及屏幕坐标(与 QGraphicsView 相反,它也可以工作但没有此信息):

void YourGraphicsScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
    // event->scenePos() is available
    QMenu menu(this);
    menu.addAction(...);
    menu.addAction(...);
    ...
    menu.exec(event->screenPos());
}

2
这是一个不错的解决方案。QMenu menu(this); 不起作用。您可以使用 QMenu menu(event->widget()); 来获取活动窗口小部件,以充当 QMenu 的 QWidget 父级。 - gamecreature
2
实际上,似乎没有必要给菜单指定父级。QMenu menu() 可以正常工作,因为上下文菜单本身就是一个窗口,并且正在以屏幕坐标定位。 - Jesse Crossen

12

QGraphicsView是用于显示QGraphicsScene内容的小部件。因此,实现上下文菜单(弹出菜单)的正确位置是QGraphicsView。

您需要在继承自QGraphicsView的自己的类中重新实现contextMenuEvent函数:

void YourGraphicsView::contextMenuEvent(QContextMenuEvent *event)
{
    QMenu menu(this);
    menu.addAction(...);
    menu.addAction(...);
    ...
    menu.exec(event->globalPos());
}

还可以参考Qt的菜单示例


谢谢!它有效了,但我需要做一些更改。1. 首先,由于我的项目类型是Qt GUI应用程序,我需要将给定的QGraphicsView替换为自己的。我通过手动编辑 .ui 文件并替换对象的类名来实现这一点。2. 我使用了以下示例进行 QgraphicsView 子类化:http://doc.trolltech.com/4.3/graphicsview-elasticnodes.html。我必须修改构造函数以包括父小部件的参数:GraphWidget(QWidget * parent) [...]。然后,只需在此类中实现上下文菜单事件即可完成操作。 - TudorT
我是否可以用不需要手动修改 .ui 文件的方式来完成这个任务? - TudorT
您可以在QtCreator的设计视图中,通过小部件上下文菜单中的“提升为...”操作,将小部件类从QGraphicsView更改为您自己的类。 - user362638
答案中的“Qt菜单示例”链接已经失效(截至2016年9月1日),因此这里提供Qt 5.7菜单示例的链接:http://doc.qt.io/qt-5/qtwidgets-mainwindows-menus-example.html - mtb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接