如何从 qgraphicsview 中的 qgraphicsitem 获取不同的上下文菜单?

Posted

技术标签:

【中文标题】如何从 qgraphicsview 中的 qgraphicsitem 获取不同的上下文菜单?【英文标题】:How to get different context menu from qgraphicsitem inside a qgraphicsview? 【发布时间】:2014-10-08 07:46:43 【问题描述】:

我有一个 qgraphicsview,它包含一个场景,里面有一些图形项目。 我已通过 setcontextmenupolicy(qt::actionscontextmenu) 在 qgraphicsview 中启用上下文菜单,但现在我的 qgraphicsitem 无法接收任何 qgraphicsscenecontextmenuevent 事件。因此只出现qgraphicsview的上下文菜单。

我该如何解决这个问题?

【问题讨论】:

请提供代码示例; QGraphicsView 中似乎没有函数“setContextMenu”:qt-project.org/doc/qt-5/qgraphicsview-members.html 您的意思是 setContextMenuPolicy 吗? 对不起,它是 setcontextmenupolicy。我会改的。 只检查一个项目是否被点击,然后直接为该项目调用上下文菜单执行函数? 对不起。但是如何做到这一点,您可以提供更多提示吗? 【参考方案1】:

在下面的代码中,我创建了自己的场景类,继承自 QGraphicsScene

然后重新实现contextMenuEvent我首先检查事件位置是否有项目,即我是否右键单击场景中的项目。

如果是这样,请尝试在该项目上运行任何 contextMenuEvent

如果没有项目,或者它没有自己的contextMenuEvent,则只运行场景版本的上下文事件。

将 PySide.QtGui 导入为 QtGui 将 PySide.QtCore 导入为 QtCore

import PySide.QtGui as QtGui
import PySide.QtCore as QtCore

class MyScene(QtGui.QGraphicsScene):

    def __init__(self, *args, **kwargs):
        super(self.__class__, self).__init__(*args, **kwargs)

    def contextMenuEvent(self, event):
        # Check it item exists on event position
        item = self.itemAt(event.scenePos().toPoint())
        if item:
            # Try run items context if it has one
            try:
                item.contextMenuEvent(event)
                return
            except:
                pass

        menu = QtGui.QMenu()
        action = menu.addAction('ACTION')

【讨论】:

以上是关于如何从 qgraphicsview 中的 qgraphicsitem 获取不同的上下文菜单?的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个类中继承 QGraphicsRectItem 和 QGraphicsEllipseItem?

如何从 QGraphicsView 中检索选定区域?

如何从 QGraphicsView 保存图像?

如何从 QGraphicsScene/QGraphicsView 创建图像文件?

如何在 QT 中的 QgraphicsView 中保持图像原始

从 QGraphicsView 向前按键