2014-04-09 70 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