You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt信号无法连接到自定义对象类中的函数问题排查

问题分析与修复方案

报错原因

你遇到的TypeError: connect() failed between VerifyWorker.finished_value_signal[bool] and set_verified()错误,核心原因有两个:

  1. AppState未继承QObject:@QtCore.pyqtSlot(bool)装饰器仅对继承自QObject的类生效,普通object子类使用该装饰器无法生成合法的槽函数,导致信号连接失败。
  2. 代码存在语法错误:类定义、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:30:49