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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 12:42:17