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

Posted

技术标签:

【中文标题】具有任意类型参数的 PyQt 信号 / PyQt_PyObject 等效于新型信号【英文标题】:PyQt signal with arguments of arbitrary type / PyQt_PyObject equivalent for new-style signals 【发布时间】:2010-12-23 22:44:40 【问题描述】:

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

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

但是我将如何使用新式信号来编写这个?

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

【问题讨论】:

【参考方案1】:

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

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

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

self.valueChanged.emit(anyObject)

【讨论】:

【参考方案2】:

我是初学者,这是我试图回答的第一个问题,如果我误解了这个问题,请原谅......

以下代码发出一个发送自定义 Python 对象的信号,插槽使用该信号 打印“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()

【讨论】:

这可能可行,但比使用我在原始问题中展示的旧式 API 更难看。

以上是关于具有任意类型参数的 PyQt 信号 / PyQt_PyObject 等效于新型信号的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 dbus:强制信号参数的类型签名为字符串数组

PYQT学习之自定义信号

PyQt5-Qt DesignerpyqtSignal()-高级自定义信号与槽

使用新型信号/插槽时的 PyQt_PyObject 等效项?

PyQt4发射信号

PyQt 中的信号和槽