具有任意类型参数的PyQt信号/PyQt_PyObject等价于新样式信号

2024-06-01 01:37:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个对象,它应该通过发出一个新值作为参数的信号来表示一个值已经改变。值的类型可以更改,所以我不确定如何编写信号类型。我知道我可以用这种老式信号来解释:

self.emit(SIGNAL("valueChanged(PyQt_PyObject)"), newvalue)

但我该如何用新型信号来写呢?

我知道a previous question与此相关,但没有给出“真正”的答案。


Tags: 对象self类型参数signal信号老式pyqt
2条回答

我是个初学者,这是我要回答的第一个问题,如果我误解了这个问题,请道歉。。。

下面的代码发出一个发送自定义Python对象的信号,slot使用这个 类来打印“Hello World”。

import sys
from PyQt4.QtCore import pyqtSignal, QObject

class NativePythonObject(object):
    def __init__(self, message):
        self.message = message

    def printMessage(self):
        print(self.message)
        sys.exit()

class SignalEmitter(QObject):
    theSignal = pyqtSignal(NativePythonObject)

    def __init__(self, toBeSent, parent=None):
        super(SignalEmitter, self).__init__(parent)
        self.toBeSent = toBeSent

    def emitSignal(self):
        self.theSignal.emit(toBeSent)

class ClassWithSlot(object):
    def __init__(self, signalEmitter):
        self.signalEmitter = signalEmitter
        self.signalEmitter.theSignal.connect(self.theSlot)

    def theSlot(self, ourNativePythonType):
        ourNativePythonType.printMessage()

if __name__ == "__main__":
    toBeSent = NativePythonObject("Hello World")
    signalEmitter = SignalEmitter(toBeSent)
    classWithSlot = ClassWithSlot(signalEmitter)
    signalEmitter.emitSignal()

首先,从中发出的对象需要定义为其的属性的信号:

class SomeClass(QObject):
    valueChanged = pyqtSignal(object)  

注意,信号有一个类型的参数object,它应该允许任何东西通过。然后,您应该能够使用任何数据类型的参数从类内发出信号:

self.valueChanged.emit(anyObject)

相关问题 更多 >