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

PySide6 QObject子类自定义信号无法被槽函数接收问题

问题根因

你的代码存在三个直接导致信号无法触发槽函数的问题:

  • 信号槽绑定时机错位:GetVersion的__init__方法执行时,就已经跑完了网络请求、触发了this_should_emit信号的发射;但你的信号绑定逻辑是在GetVersion()构造完成、返回实例之后才执行的——信号发射早于绑定操作,槽函数自然不会被调用。
  • 网络对象生命周期异常:QNetworkAccessManager是__init__内的局部变量,构造函数执行结束后就会被Python垃圾回收,脱离Qt对象树管理,网络回调、信号传递都会出现不可预期的错误。
  • 设计违背异步初衷:在构造函数里嵌套QEventLoop做阻塞等待,把原本异步的网络请求强行改成同步逻辑,很容易卡住UI线程,和你要实现异步数据拉取的目标冲突。
修正代码

调整GetVersion实现

把网络请求逻辑从构造函数中拆出来,将QNetworkAccessManager存为实例属性绑定到对象树,避免被回收,等信号绑定完成后再发起请求:

# version.py
import json
from PySide6.QtCore import QUrl, QObject, Signal
from PySide6.QtNetwork import QNetworkRequest, QNetworkAccessManager


class GetVersion(QObject):
    this_should_emit = Signal()

    def __init__(self, parent=None):
        super(GetVersion, self).__init__(parent)
        # 存为实例属性,绑定父对象纳入Qt对象树管理,避免被GC回收
        self.manager = QNetworkAccessManager(self)
        self.manager.finished.connect(self.get_reply)

    def fetch(self):
        # 单独封装请求发起方法,信号绑定完成后再调用
        self.manager.get(QNetworkRequest(QUrl("http://localhost:5000/v1/test")))

    def get_reply(self, n):
        print('got reply')
        temp = bytes(n.readAll()).decode("utf8")
        temp = json.loads(temp)
        print(temp)
        # 请求处理完成后发射信号,此时信号槽已经完成绑定
        self.this_should_emit.emit()

调整主窗口实例化逻辑

调整执行顺序:先创建实例、绑定信号槽,再触发网络请求:

# main.py
from PySide6.QtWidgets import QMainWindow

from api.initialize.version import GetVersion
from ui_build.main import Ui_MainWindow


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        get_version = GetVersion(parent=self)
        # 先完成信号槽绑定
        get_version.this_should_emit.connect(self.verified_connection)
        # 所有绑定就绪后发起请求
        get_version.fetch()

    def verified_connection(self):
        print("verified")

补充:如果确实需要同步等待请求返回,也不要在构造函数内做阻塞操作,等信号绑定完成后再执行阻塞逻辑即可。更推荐使用上述纯异步实现,不会阻塞UI线程,符合Qt事件循环的设计规范。

内容的提问来源于stack exchange,提问作者hlafaille

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:51:25