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

如何获取PyQt表格中选中按钮的索引并在函数中打印

解决QTableWidget按钮点击获取对应行索引的问题

你的核心问题是点击按钮时无法获取其所在行的索引,原代码存在两个关键问题:

  1. 循环里用controls[i] = QtWidgets.QPushButton("Button")覆盖了从cmds.ls拿到的原对象列表,属于无意义操作;
  2. 按钮的clicked信号没有传递索引参数,导致printing函数无法识别点击的是哪一行。

以下是两种直接可行的修改方案:

方案1:用Lambda传递索引参数

修改refresh_table中的信号连接逻辑,通过lambda将当前循环的索引i直接传给printing函数:

def refresh_table(self):
    self.table_wdg.setRowCount(0)
    controls = cmds.ls("*_ctrl")
    
    for i in range(len(controls)):
        self.table_wdg.insertRow(i)
        btn = QtWidgets.QPushButton("Button")  # 单独定义按钮,不覆盖原controls列表
        self.table_wdg.setCellWidget(i, 0, btn)
        # 把i设为lambda默认参数,避免循环变量绑定到最终值的问题
        btn.clicked.connect(lambda checked, idx=i: self.printing(idx))

def printing(self, idx):
    print(f"点击的按钮索引是:{idx}")

方案2:通过按钮sender()获取行索引

如果不想用lambda,也可以通过QObject.sender()拿到触发点击的按钮,再通过表格方法反向获取行索引:

def refresh_table(self):
    self.table_wdg.setRowCount(0)
    controls = cmds.ls("*_ctrl")
    
    for i in range(len(controls)):
        self.table_wdg.insertRow(i)
        btn = QtWidgets.QPushButton("Button")
        self.table_wdg.setCellWidget(i, 0, btn)
        btn.clicked.connect(self.printing)

def printing(self):
    btn = self.sender()  # 获取触发信号的按钮对象
    if btn:
        # 通过按钮位置获取表格索引,再提取行号
        pos = btn.pos()
        index = self.table_wdg.indexAt(pos)
        print(f"点击的按钮索引是:{index.row()}")

两种方案都能解决问题,方案1逻辑更直接,方案2适合需要从按钮本身获取额外信息的场景。

内容的提问来源于stack exchange,提问作者Dobri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:05:33