Python 没有子类化的另一个对象的PyQt/PySide回波信号

Python 没有子类化的另一个对象的PyQt/PySide回波信号,python,qt,pyqt,signals,pyside,Python,Qt,Pyqt,Signals,Pyside,我正在管理一些长时间运行的任务,使用信号和插槽来跟踪进度等等。我有一个跑步课,开始是这样的: from PySide import QtCore, QtGui class Run(QtCore.QObject): running = QtCore.Signal(bool) finished = QtCore.Signal(object) status = QtCore.Signal(str) message = QtCore.Signal(object)

我正在管理一些长时间运行的任务,使用信号和插槽来跟踪进度等等。我有一个跑步课,开始是这样的:

from PySide import QtCore, QtGui

class Run(QtCore.QObject):
    running = QtCore.Signal(bool)
    finished = QtCore.Signal(object)
    status = QtCore.Signal(str)
    message = QtCore.Signal(object)
    progress = QtCore.Signal(float)
    time_remaining_update = QtCore.Signal(str)
    initialized = QtCore.Signal()
    failed = QtCore.Signal(object)
    pitch_update = QtCore.Signal(float)

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

        #... rest of the class ...
我最近重构了一些东西,并编写了一个任务类,其中包含一个运行实例作为属性。我想回应许多上游的跑步信号。这是我当前的解决方案:

class Task(QtCore.QObject):

    #Signals echoed from Run
    running = QtCore.Signal(bool)
    status = QtCore.Signal(str)
    message = QtCore.Signal(object)
    progress = QtCore.Signal(float)
    time_remaining_update = QtCore.Signal(str)
    initialized = QtCore.Signal()

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

        self.run = run

        #Echo signals from run
        signals = ['running', 'status', 'message', 'progress', 'time_remaining_update', 'initialized']
        for signal in signals:
            #Re-emit the signal
            getattr(self.run, signal).connect(lambda *args: getattr(self, signal).emit(*args))

        #... rest of class ...
我确认lambda*args:func*args模式将避免在不向lambda传递任何内容的情况下向func传递任何内容,这是遵守不同信号的签名所必需的

这是处理从一个对象到另一个对象的回声或反弹信号的最佳方法吗?我基本上是在用我的任务API更改/添加其他方面时,试图保留一些RunAPI

我意识到我可以通过子类化和重写我想要更改的内容来获得所有的RunAPI,但我不想子类化,因为任务处理在失败后重新启动运行。我希望将运行逻辑与处理重新启动运行的代码分开。还有一些我不希望通过任务传播的运行信号和方法

我能想到的唯一更优雅的解决方案是自动创建任务信号。。。也许制作一个echo_信号装饰器,它接受一个QObject和一个信号名称列表,然后执行这些操作


有Qt特性可以更优雅地实现这一点吗?有什么建议吗?

在Qt中,您可以将信号连接到其他信号,除非我遗漏了关于您的示例的某些内容。

所有这些间接的目的是什么?为什么Task类的使用者不能这样做,例如Task.run.status.connecthandler?PS:您当前的代码中有一个bug,因为lambda中的信号范围没有正确确定。你需要做lambda*args,signal=signal:……谢谢-是的,范围界定问题给了我一些我不理解的错误,所以我放弃了这个想法。我目前的解决方案是按照您所说的去做,并引用task.run。我想很容易变得聪明,制造更多的问题。