0

我正在使用经典的 QgraphicsView / QGraphicsScene / QGraphicsItem 框架。我在 QgraphicsView 中声明了一个上下文菜单:

    self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
    self.customContextMenuRequested.connect(self.__contextMenu)

然后稍后:

# ---------------------------------------------------------------------------
def __contextMenu(self, position):
  """ """
  # ----> Creating Context menu -----------------------------------
  oTreeMenu = QtGui.QMenu()

  etc ...

然后在 QGraphicsItem 实例类中,我使用 contextMenuEvent,如下所示:

# ---------------------------------------------------------------------------
def contextMenuEvent(self, event):
  """ """
  # ----> Creating Context menu -----------------------------------
  oTreeMenu = QtGui.QMenu()

问题是 QGraphicsItem 事件完全被 QGraphicsView 覆盖。我应该如何着手获得它们?

4

2 回答 2

0

我是用 C++ 做的,但我认为它应该有帮助

在图形视图中:

void MyGraphicsView::contextMenuEvent(QContextMenuEvent * event)
{
    QGraphicsView::contextMenuEvent(event);
    if(!event->isAccepted())
    {
        QMenu * menu  = new QMenu;
        menu->addAction("GraphicsView Action 1");
        menu->addAction("GraphicsView Action 2");
        menu->popup(event->globalPos());
    }
}

在图形项中:

void MyGraphicsItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event)
{
    QMenu *menu = new QMenu;
    menu->addAction("Action 1");
    menu->addAction("Action 2");
    menu->popup(event->screenPos());
    event->setAccepted(true);
}
于 2014-09-01T10:17:06.500 回答
0

好的,我找到了解决方案:

我正在使用 QGraphicsScene contextMenuEvent 而不是其他 2 个。在事件中,我正在检查鼠标是否在 QGraphicsItem 上方,然后构建相应的菜单。我不太喜欢这个解决方案,因为我的所有功能都在 QGraphicsScene 类下,其中大部分都与项目有关,而不是场景。所以它有点乱,但它有效。提前感谢任何有更好解决方案的人。

于 2013-10-14T18:52:49.720 回答