在QGraphicsScene上显示弹出菜单单击或右键单击

Tud*_*orT 8 qt contextmenu qgraphicsscene qmouseevent

当用户右键单击场景的空白部分时,有没有办法显示弹出窗口?

我是Qt的新手,我尝试过插槽和子类,但无济于事.

没有这样的插槽,分别是:

"错误:'QMouseEvent'尚未宣布"

在尝试实施该onMouseRelease事件时.

小智 10

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

你需要重新实现contextMenuEvent函数是你自己继承自QGraphicsView的类:

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

另请参阅Qt的菜单示例.


Syd*_*ius 7

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

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

  • 这是一个很好的解决方案。QMenu 菜单(this); 不起作用。您可以使用 QMenu 菜单(event->widget()); 获取活动小部件作为 QMenu 的 QWidget 父级。 (2认同)
  • 实际上,似乎没有必要给菜单一个父级。QMenu menu() 工作得很好,因为上下文菜单本身就是一个窗口,并且位于屏幕坐标中。 (2认同)