PyQt信号无法连接到自定义对象类中的函数问题排查
问题分析与修复方案
报错原因
你遇到的TypeError: connect() failed between VerifyWorker.finished_value_signal[bool] and set_verified()错误,核心原因有两个:
- AppState未继承QObject:
@QtCore.pyqtSlot(bool)装饰器仅对继承自QObject的类生效,普通object子类使用该装饰器无法生成合法的槽函数,导致信号连接失败。 - 代码存在语法错误:类定义、super调用的语法问题会引发执行异常,间接影响信号机制正常工作。
具体修复步骤
1. 修改AppState的继承关系
将AppState改为继承QtCore.QObject,并调用父类构造函数:
class AppState(QtCore.QObject): def __init__(self): super(AppState, self).__init__() self.copy_verified = None self.qthreadpool = QThreadPool() self.verify_copy()
2. 修复VerifyWorker的语法错误
- 补全
__init__方法末尾的冒号 - 修正super调用的错误写法:
class VerifyWorker(QRunnable): def __init__(self, dir_a, dir_b): super(VerifyWorker, self).__init__() self.signals = WorkerSignal() self.dir_a = dir_a self.dir_b = dir_b
3. 补全AppState类定义的冒号
class AppState(QtCore.QObject): # 类内容...
4. 完善变量定义(可选)
verify_copy方法中的dir_a和dir_b未定义,需根据实际场景传入,比如在AppState初始化时传入目录路径:
class AppState(QtCore.QObject): def __init__(self, dir_a, dir_b): super(AppState, self).__init__() self.copy_verified = None self.qthreadpool = QThreadPool() self.dir_a = dir_a self.dir_b = dir_b self.verify_copy() def verify_copy(self): verify_worker = VerifyWorker(self.dir_a, self.dir_b) verify_worker.signals.finished_value_signal.connect(self.set_verified) self.qthreadpool.start(verify_worker)
在MyGui中初始化时传入实际路径:
self.state = AppState("实际目录A路径", "实际目录B路径")
修复后的完整代码
import sys from PyQt5 import QtCore, QtWidgets from PyQt5.QtCore import QRunnable, pyqtSlot, pyqtSignal, QThreadPool # 替换为你的工具模块 import ut class WorkerSignal(QtCore.QObject): finished_value_signal = QtCore.pyqtSignal(bool) class VerifyWorker(QRunnable): def __init__(self, dir_a, dir_b): super(VerifyWorker, self).__init__() self.signals = WorkerSignal() self.dir_a = dir_a self.dir_b = dir_b @QtCore.pyqtSlot() def run(self): verified = ut.dirs_match(self.dir_a, self.dir_b) self.signals.finished_value_signal.emit(verified) class AppState(QtCore.QObject): def __init__(self, dir_a, dir_b): super(AppState, self).__init__() self.copy_verified = None self.qthreadpool = QThreadPool() self.dir_a = dir_a self.dir_b = dir_b self.verify_copy() def verify_copy(self): verify_worker = VerifyWorker(self.dir_a, self.dir_b) verify_worker.signals.finished_value_signal.connect(self.set_verified) self.qthreadpool.start(verify_worker) @QtCore.pyqtSlot(bool) def set_verified(self, verified): self.copy_verified = verified print(f"目录验证结果:{verified}") class MyGui(QtWidgets.QMainWindow): def __init__(self, dir_a, dir_b): super(MyGui, self).__init__() # self.ui = UI_MainWindow() # self.ui.setupUi(self) self.state = AppState(dir_a, dir_b) if __name__ == '__main__': try: app = QtWidgets.QApplication(sys.argv) # 替换为实际的目录路径 ui = MyGui("/path/to/dir1", "/path/to/dir2") ui.show() app.setActiveWindow(ui) sys.exit(app.exec_()) except Exception as e: print(str(e))
内容的提问来源于stack exchange,提问作者AKS
相关产品推荐
相关产品推荐

