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

如何在QTableWidget中点击对应按钮打印该行的data_id值?

问题解决:QTableWidget按钮点击仅打印对应行data_id

问题原因

你的acknowledge函数逻辑错误:每次点击按钮时,它会重新请求API并遍历所有数据打印全部data_id,而非当前点击按钮对应的那一个。你已经通过self.dictAck存储了按钮与对应行data_id的映射,但未在点击事件中利用该映射。

另外,代码里my_data_str = json.dumps(response)再json.loads(my_data_str)属于冗余操作——req.json()已经直接返回了解析后的Python数据结构,无需二次序列化再反序列化。

修复方案

1. 简化数据请求部分(推荐优化)

修改latestdata函数的 data 处理逻辑,去掉冗余操作:

def __init__(self):
     self.dictAck = {}
     self.my_buttons = []  # 确保这个列表已初始化

def latestdata(self):
    req = requests.get('...') # 替换为你的API地址
    dataResponse = req.json()  # 直接使用解析后的结果
    row = 0       

    self.latestdatatable.setRowCount(len(dataResponse))

    for item in dataResponse:
        self.ack_btn = QtWidgets.QPushButton()
        self.ack_btn.setStyleSheet("border: none;")
        icon7 = QtGui.QIcon()
        icon7.addPixmap(QtGui.QPixmap("images/check.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.ack_btn.setIcon(icon7)
        self.ack_btn.setIconSize(QtCore.QSize(40, 35))
        
        # 填充表格内容
        self.latestdatatable.setItem(row,0,QtWidgets.QTableWidgetItem(str(item["date_added"])))
        self.latestdatatable.setItem(row,1,QtWidgets.QTableWidgetItem(str(item["Zone"])))
        self.latestdatatable.setItem(row,2,QtWidgets.QTableWidgetItem(str(item["Room"])))
        self.latestdatatable.setItem(row,3,QtWidgets.QTableWidgetItem(str(item["Device"])))
        self.latestdatatable.setCellWidget(row, 4, self.ack_btn)

        # 存储按钮与data_id的映射(仅保留需要的data_id即可)
        self.dictAck[self.ack_btn] = item["data_id"]
        self.ack_btn.clicked.connect(self.acknowledge)
        
        row += 1

2. 重写acknowledge函数

通过self.sender()获取当前点击的按钮,从self.dictAck中取出对应data_id,再执行后续逻辑:

def acknowledge(self):
    # 获取触发点击事件的按钮
    clicked_btn = self.sender()
    if clicked_btn in self.dictAck:
        target_data_id = self.dictAck[clicked_btn]
        print(target_data_id)
        
        # 这里添加你需要的API调用逻辑,比如用target_data_id发起请求
        # req = requests.get(f'你的API地址?data_id={target_data_id}')
        # 处理API响应...

关键说明

  • self.sender()是PyQt中获取触发信号控件的方法,通过它可直接拿到当前点击的按钮实例。
  • 利用提前存储的self.dictAck映射,直接定位对应行的data_id,避免重复遍历所有数据。
  • 移除冗余的JSON序列化/反序列化操作,提升代码运行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:30:47