嗨,这是我之前的查询中的后续问题从QGraphicsItems上的“上下文菜单”操作中获取事件 我现在正试图从myQgraphicsItem发出一个信号,目标是当用户右键单击时 并选择action1,notifyaction1函数将告诉场景做某事(向发送信号的graphicsitem添加更多项目) 做了一些研究后我发现QgraphicsItem无法发出,请参阅 * Stack Overflow: Qt的QGraphicsItem中的事件和信号:假设如何工作?*
所以我在我的班级添加了一个signaling_object(QObject),但我不知道如何发送/接收信号,以便父场景可以获得用户动作的通知。
class Node(QtGui.QGraphicsItem):
Type = QtGui.QGraphicsItem.UserType + 1
def __init__(self, Parent=None):
super(Node, self).__init__()
self.edgeList = []
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)
self.signaling_object=QtCore.QObject()
@QtCore.pyqtSlot()
def notifyaction(self):
#print "action1"
message="action1"
QtCore.QObject.emit(self.signaling_object,QtCore.SIGNAL('action_update(QString)'),str(message))
print self.signaling_object.signalsBlocked()
child_items=self.childItems()
for item in child_items:
#print item
item.hide()
self.hide()
def contextMenuEvent(self, contextEvent):
object_cntext_Menu = QtGui.QMenu()
object_cntext_Menu.addAction("action1")
object_cntext_Menu.addAction("action2", self.notifyaction)
object_cntext_Menu.addAction("action3")
position=QtGui.QCursor.pos()
object_cntext_Menu.exec_(position)
无论如何都要从qgraphicsItem的上下文菜单中将通知发送到其他qt对象。我在Windows上使用PyQt / Python 非常感谢
答案 0 :(得分:3)
如果您想要图形项的信号/插槽支持,则可以使用QGraphicsObject代替QGraphicsItem
。这将允许您发出海关信号,如下:
class Node(QtGui.QGraphicsObject):
customSignal = QtCore.pyqtSignal(str)
...
@QtCore.pyqtSlot()
def notifyaction(self):
message = 'action1'
self.customSignal.emit(message)
要接收这些自定义信号,只需连接适当的处理程序:
item.customSignal.connect(scene.handleCustomSignal)
然而,完全避免信号并直接调用场景可能更简单。每个图形项都可以通过其scene方法访问已添加到的场景。所以你可以做一些简单的事情:
@QtCore.pyqtSlot()
def notifyaction(self):
message = 'action1'
scene = self.scene()
if scene is not None:
scene.handleItemAction(self, message)
以这种方式做事意味着您不必为每个创建的图形项连接信号。