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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:52:36