如何在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
相关产品推荐
相关产品推荐

