PySide6中QObject.disconnect()行为差异的原因及相关说明
PySide6信号槽断开行为差异问题解析
功能说明
以下PySide6代码实现了核心功能:
- 通过Connect按钮将目标按钮的
clicked信号与on_button_clicked槽函数建立连接 - 通过Disconnect按钮断开上述连接
- 实时统计并显示当前的连接数量
import sys from PySide6.QtWidgets import (QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout, QLabel) class Window(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() self.setLayout(layout) self.conn_count = 0 h_layout1 = QHBoxLayout() self.button = QPushButton('Click me!') self.label = QLabel('Connections: 0') h_layout1.addWidget(self.button) h_layout1.addWidget(self.label) layout.addLayout(h_layout1) h_layout2 = QHBoxLayout() connect_button = QPushButton('Connect') connect_button.clicked.connect(self.on_connect_clicked) disconnect_button = QPushButton('Disconnect') disconnect_button.clicked.connect(self.on_disconnect_clicked) h_layout2.addWidget(connect_button) h_layout2.addWidget(disconnect_button) layout.addLayout(h_layout2) def on_button_clicked(self): print('Button clicked') def on_connect_clicked(self): self.button.clicked.connect(self.on_button_clicked) self.conn_count += 1 self.label.setText('Connections: ' + str(self.conn_count)) print(self.conn_count) def on_disconnect_clicked(self): self.button.clicked.disconnect(self.on_button_clicked) self.conn_count -= 1 self.label.setText('Connections: ' + str(self.conn_count)) print(self.conn_count) if __name__ == '__main__': app = QApplication(sys.argv) main_window = Window() main_window.show() sys.exit(app.exec())
异常现象
在PySide6 6.9.1(Python 3.11.9、Windows 11)环境下运行代码时,会出现不符合预期的行为:
- 第一次点击Disconnect按钮,会正常移除1个连接
- 第二次点击Disconnect按钮,会直接移除所有剩余连接,同时抛出
RuntimeWarning提示断开失败
而相同代码在PyQt6环境中,每次点击Disconnect按钮都会逐个移除连接,直到连接数归0。
问题原因
这是PySide6的已知BUG,根源在于PySide6中使用disconnect(槽函数)的方式时,无法精准处理重复连接的逐个断开操作:第二次调用该方法时,会一次性断开所有关联到目标槽函数的连接,当无剩余连接可断开时就会触发警告。
解决方案与修复状态
官方给出的正确做法是:若需要逐个断开单个连接,需使用connect()方法返回的Connection ID对象来执行断开操作。目前该BUG已被修复,修复内容将合并至PySide6 6.10版本中。
内容的提问来源于stack exchange,提问作者Anonimista
相关产品推荐
相关产品推荐

