如何获取PyQt表格中选中按钮的索引并在函数中打印
解决QTableWidget按钮点击获取对应行索引的问题
你的核心问题是点击按钮时无法获取其所在行的索引,原代码存在两个关键问题:
- 循环里用
controls[i] = QtWidgets.QPushButton("Button")覆盖了从cmds.ls拿到的原对象列表,属于无意义操作; - 按钮的
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
相关产品推荐
相关产品推荐

