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。我想很容易变得聪明,制造更多的问题。