从 QGraphicsItem 上的上下文菜单操作中获取事件

Posted

技术标签:

【中文标题】从 QGraphicsItem 上的上下文菜单操作中获取事件【英文标题】:Getting events from Context Menu action on QGraphicsItems 【发布时间】:2014-04-09 20:24:09 【问题描述】:

您好,我正在尝试让上下文菜单操作适用于 qgraphicsitem,概括地说,我希望能够右键单击场景中的任何 qgraphicsitem,然后显示上下文菜单并运行 3 个功能之一,具体取决于选择/单击了哪个项目。为此,我创建了一个子类 qgraphicsitem 的节点类,我的代码如下

class Node(QtGui.QGraphicsItem):
Type = QtGui.QGraphicsItem.UserType + 1

def __init__(self, Parent=None):
    super(Node, self).__init__()

    self.newPos = QtCore.QPointF()

    self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
    self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable)
    self.setFlag(QtGui.QGraphicsItem.ItemSendsGeometryChanges)
    self.setCacheMode(QtGui.QGraphicsItem.DeviceCoordinateCache)
    self.setZValue(1)


def notifyaction1(self):
    print "action1"

def contextMenuEvent(self, contextEvent):
    object_cntext_Menu = QtGui.QMenu()
    object_cntext_Menu.addAction("action1")
    object_cntext_Menu.addAction("action2", object_cntext_Menu, QtCore.SLOT(self.notifyaction1()))
    object_cntext_Menu.addAction("action3")
    position=QtGui.QCursor.pos() 
    object_cntext_Menu.exec_(position)

到目前为止,此代码在正确的位置显示上下文菜单,但我如何知道单击了哪个项目,以便我可以运行相应的操作相关功能。目前只要右键触发notifyaction1函数,报错

Object::connect: 需要括号,插槽 QMenu::

我在 Windows 上使用 pyqt4/python。 谢谢

【问题讨论】:

【参考方案1】:

QtCore.SLOT 的参数应该是与插槽签名匹配的字符串,而您试图传入notifyaction1 的返回值(即None)。此外,由于notifyaction1 不是 Qt 插槽,因此您需要相应地对其进行装饰,以便将其用作一个:

    @QtCore.pyqtSlot()
    def notifyaction1(self):
        print "action1"
    ...

    object_cntext_Menu.addAction("action2", self, QtCore.SLOT("notifyaction1()"))

但是,我不推荐这种方法,因为它过于复杂。 QMenu.addAction 的签名在 PyQt 中的工作方式不同,因为它可以接受任何可调用的 Python:

    object_cntext_Menu.addAction("action2", self.notifyaction1)

事实上,无论你在哪里看到带有如下参数对的 Qt 函数:

    const QObject * receiver, const char * member

您通常可以使用单个 python 可调用参数。

【讨论】:

以上是关于从 QGraphicsItem 上的上下文菜单操作中获取事件的主要内容,如果未能解决你的问题,请参考以下文章

QGraphicsItem 的子类仅从边界矩形接收边框上的悬停事件

如何在不同操作系统上处理 Qt 中的不同事件序列?

Dojo 图表上的上下文菜单操作

使用Shell脚本运行 "清理 "右键菜单操作。

QGraphicsScene 上的静态 QGraphicsItem

Qt 获取QGraphicsItem在屏幕上的位置,在QGraphicsItem中获取全局位置,转换为screenPos