2014-04-09 38 views
1

嗨我想获得contextmenu行动为广泛的笔画qgraphicsitem工作,我希望能够右键单击我的场景中的任何qgraphicsitem获得一个上下文菜单和取决于选择/点击哪个项目,运行3个功能中的一个。为了得到这个我创建了一个节点类的子类的QGraphicsItem和我的代码如下从QGraphicsItems的上下文菜单动作获取事件

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功能::连接:括号预计,插槽QMenu ::

我在Windows上使用PyQt4的/蟒蛇。 谢谢

回答

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

+0

非常感谢,这解决了我的问题 – user595985