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

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即可,需要改两处代码:

  1. 修改QCustomQWidget类里的connectButton方法,接收槽函数参数完成绑定:
    def connectButton(self, slot_func):
        self.openButton.clicked.connect(slot_func)
    
  2. 在主窗口循环调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:45:42