您好我正在尝试使用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。 谢谢
答案 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可调参数。