从QGraphicsItems上的Context Menu操作获取事件

时间:2014-04-09 20:24:10

标签: qt python-2.7 pyqt pyqt4

您好我正在尝试使用contextmenu操作为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 个答案:

答案 0 :(得分:0)

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可调参数。