PySide6如何将一个类的信号连接到另一个类的槽函数
跨类连接PySide6信号槽的实现方法
Qt的信号槽机制不要求信号和槽必须属于同一个类,只要能同时拿到信号所属对象、槽所属对象的实例引用,就可以直接完成绑定,和同个类内连接的逻辑没有本质区别。
针对你提供的代码,有两种可直接运行的实现方案:
方案1:直接在主窗口逻辑中绑定(最简单直接)
你代码里自定义组件QCustomQWidget的openButton是实例属性,主窗口创建完组件实例后可以直接访问到它的clicked信号,不需要额外写空的connectButton封装方法,直接在循环里加一行连接代码即可:
# 原来循环里创建组件的代码保持不变 myQCustomQWidget = QCustomQWidget() myQCustomQWidget.setTextUp(str(index)) myQCustomQWidget.setTextDown(name) myQCustomQWidget.setButton(str(btname)) myQCustomQWidget.button_row = index # 删掉原来空的myQCustomQWidget.connectButton()调用,换成下面这行 myQCustomQWidget.openButton.clicked.connect(self.setNewText) self.table.setCellWidget(index, 1, myQCustomQWidget) self.table.setRowHeight(index,90)
改完之后点击任意按钮,都会触发主窗口的setNewText方法,打印test。
方案2:保留自定义组件的connectButton方法做封装
如果你希望组件对外提供统一的按钮绑定入口,只需要把待连接的槽函数作为参数传入connectButton即可,需要改两处代码:
- 修改
QCustomQWidget类里的connectButton方法,接收槽函数参数完成绑定:def connectButton(self, slot_func): self.openButton.clicked.connect(slot_func) - 在主窗口循环调用
connectButton时,把主窗口的槽方法传进去:myQCustomQWidget.connectButton(self.setNewText)
这种写法更适合组件需要复用、绑定逻辑需要统一封装的场景。
扩展:获取触发信号的按钮所属行
如果需要在setNewText里知道是哪一行的按钮被点击了,可以用lambda传参的方式绑定,修改对应连接代码和槽函数即可:
# 连接时把行号作为参数传入 myQCustomQWidget.openButton.clicked.connect(lambda checked, row=index: self.setNewText(row)) # 对应修改槽函数接收参数 def setNewText(self, row): print(f"第{row}行的按钮被点击")
注意lambda里要写
row=index而不是直接用index,否则所有按钮都会绑定到循环最后一次的index值。
内容的提问来源于stack exchange,提问作者Asa
相关产品推荐
相关产品推荐

