Python 2.7 从QgraphicsItem发出信号

Python 2.7 从QgraphicsItem发出信号,python-2.7,qt4,pyqt,pyqt4,Python 2.7,Qt4,Pyqt,Pyqt4,您好,这是我先前查询的后续问题从QGraphicsSitems上的上下文菜单操作获取事件 我现在正试图从myQgraphicsItem发出一个信号,目标是当用户右键单击时 并选择action1 notifyaction1函数将通知场景执行某些操作(向发送信号的graphicsitem添加更多项目) 在做了一些研究之后,我发现QgraphicsItem无法发射,请参见*堆栈溢出: Qt的QGraphicsItem中的事件和信号:这应该如何工作?* 因此,我在我的类中添加了一个signaling_对

您好,这是我先前查询的后续问题从QGraphicsSitems上的上下文菜单操作获取事件 我现在正试图从myQgraphicsItem发出一个信号,目标是当用户右键单击时 并选择action1 notifyaction1函数将通知场景执行某些操作(向发送信号的graphicsitem添加更多项目) 在做了一些研究之后,我发现QgraphicsItem无法发射,请参见*堆栈溢出: Qt的QGraphicsItem中的事件和信号:这应该如何工作?*

因此,我在我的类中添加了一个signaling_对象(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
非常感谢

如果您想要图形项目的信号/插槽支持,您可以使用而不是
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)
但是,完全避免信号,直接调用场景可能更简单。每个图形项都可以通过其方法访问其添加到的场景。所以你可以做一些简单的事情如下:

    @QtCore.pyqtSlot()    
    def notifyaction(self):
        message = 'action1'
        scene = self.scene()
        if scene is not None:
            scene.handleItemAction(self, message)

这样做意味着您不必为创建的每个图形项目连接信号。

谢谢ekhumoro,我使用了您的第二个建议,即避免所有信号并执行scene.handleItemAction。当你提到这一点时,似乎很明显,但我一直坚持插槽/信号的想法。非常感谢你