PyQt5 QTableWidget点击按钮获取行号及首列值异常问题咨询
PyQt5 QTableWidget内嵌按钮取数问题修复
问题根因
- 行号获取错误:
tableWidget.currentRow()只能返回表格控件本身被选中激活的行,当你点击单元格内嵌的PushButton时,焦点会转移到按钮上,表格不会自动将按钮所在行设为当前选中行,自然返回的行号不符合预期。 - 现有信号绑定逻辑没有将按钮对应的行号传递给槽函数,仅靠表格当前选中状态定位行本身就不可靠。
- 单元格取值逻辑:QTableWidget行列索引从0开始计数,第一列对应列索引为0,取到对应位置的
QTableWidgetItem对象后调用text()方法即可拿到值。
修复步骤
- 修改按钮点击信号的绑定逻辑,绑定时通过lambda传入当前行号,注意要给行号参数设置默认值,避免闭包陷阱导致所有按钮都拿到最后一行的行号。
- 改造槽函数,直接接收传入的行号做定位,不再依赖
currentRow()接口。 - 取第一列值前增加非空判断,避免单元格未初始化时报错。
修正后代码
def loadtable(): database = DataBase() cur = database.cursor cur.execute('select * from sge_job where state like \'r\'') result = cur.fetchall() database.close() ui.tableWidget.setRowCount(0) header = ui.tableWidget.horizontalHeader() for i in range(9): header.setSectionResizeMode(i, QtWidgets.QHeaderView.ResizeToContents) for row_number, row_data in enumerate(result): ui.tableWidget.insertRow(row_number) button = QtWidgets.QPushButton(ui.tableWidget) button.setText("Clear") ui.tableWidget.setCellWidget(row_number, 6, button) # 修复点:绑定时传入当前行号,预留clicked信号自带的checked参数 button.clicked.connect(lambda checked, r=row_number: printrow(r)) for colum_number, data in enumerate(row_data): ui.tableWidget.setItem(row_number, colum_number, QTableWidgetItem(str(data))) def printrow(row): # 这里拿到的就是按钮所在的准确行号 print("行号:", row) # 取第一列(索引0)的单元格值 first_col_item = ui.tableWidget.item(row, 0) if first_col_item: first_col_val = first_col_item.text() print("第一列值:", first_col_val)
注意事项
- 只要是单元格内嵌的控件触发的操作,都不要依赖
currentRow()、currentItem()这类接口定位位置,这类接口仅在用户直接点击表格单元格、选中行变化时才会更新。 - 取
QTableWidgetItem前一定要做非空判断,如果对应单元格没有通过setItem()设置过内容,item()方法会返回None,直接调用text()会触发程序崩溃。
内容的提问来源于stack exchange,提问作者8bitRobot
相关产品推荐
相关产品推荐

