SuperAPI AI 工具集

qt-signals-slots

测试与质量

查看项目

更新于 10-16 06:22

技能介绍

用途:Qt 信号与槽是对象间通信的核心机制,本技能用于连接信号与槽、定义自定义信号、排查信号未触发等问题,覆盖 Python(PySide6/PyQt6)与 C++/Qt。

主要能力与要点:

  1. 定义自定义信号:Python 中信号必须声明为类属性,不能写在 init 内,否则会遮蔽描述符并破坏连接跟踪;C++ 中每个使用信号/槽的 QObject 子类必须带 Q_OBJECT 宏,缺失可能在某些配置下无编译错误却运行时失败。
  2. 连接信号:推荐新式语法,如 button.clicked.connect(self._on_button_clicked)、slider.valueChanged.connect(lambda v: ...);C++ 用 connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked)。新代码不要用旧式 SIGNAL()/SLOT() 宏,它们绕过类型检查、名称不匹配时静默失败。
  3. @Slot 装饰器(PySide6 必需):省略会导致每次 connect() 动态注册带来运行时开销、QML 中 TypeError、跨线程可能段错误。可用 QT_LOGGING_RULES="qt.pyside.libpyside.warning=true" python -m myapp 开启警告。
  4. 连接类型:AutoConnection(默认,自动选择)、DirectConnection(强制同线程同步)、QueuedConnection(跨线程或延迟到下一事件循环)、BlockingQueuedConnection(跨线程阻塞,有死锁风险)。
  5. 跨线程安全模式:用 QThread + moveToThread,先连接再启动线程;AutoConnection 会自动变为队列连接,从而安全更新 UI。
  6. 断开连接:可断开特定连接或某槽的全部连接;Python 中对存活对象方法的连接会自动清理,对 lambda 和自由函数不会,需显式断开。
  7. 调试信号未触发:确认发送对象存活、connect() 成功、信号类型匹配、C++ 中 Q_OBJECT 存在且 moc 已运行、跨线程时 moveToThread 在线程启动前完成;可加 signal.connect(lambda *args: print("FIRED", args)) 调试。
  8. 重载信号:PyQt6/C++ 用下标语法,如 spin_box.valueChanged[int].connect(...);PySide6 自动处理。

限制:资料未提供安装方式、收费、平台支持范围与性能数据,暂未提供。