如何识别三个QTableWidget中哪个的edit列被用户编辑?
解决QTableWidget编辑列限制与表识别问题
问题核心
- 原代码中每次调用
build_table都会用self.table覆盖前一个表的引用,导致无法追踪所有创建的表格 - 未设置仅
edit列(索引3)可编辑,所有单元格默认允许编辑 - 没有绑定编辑事件,无法识别用户操作的是哪一个表格
解决方案步骤
- 为每个表格设置唯一标识(
objectName),并将所有表格存入实例列表统一管理 - 全局设置表格编辑权限,仅开放
edit列 - 绑定
itemChanged信号,通过sender()获取当前操作的表格
修改后的完整代码
import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem class NewBook(QMainWindow): def __init__(self): QMainWindow.__init__(self) # 初始化表格列表,用于存储所有创建的QTableWidget实例 self.tables = [] self.setupUi(self) def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.setGeometry(QtCore.QRect(100, 60, 700, 250)) MainWindow.setWindowTitle("Aggiornamento Titoli") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") # 创建三个表格,传入唯一title作为标识 self.build_table('aaa', 20, 30, 210, 152) self.build_table('bbb', 250, 30, 210, 152) self.build_table('ccc', 480, 30, 210, 152) self.upd_Button = QtWidgets.QPushButton(self.centralwidget) self.upd_Button.setGeometry(QtCore.QRect(90, 200, 81, 20)) self.upd_Button.setObjectName("upd_Button") self.upd_Button.setText("upd") self.upd_Button.clicked.connect(self.on_click) MainWindow.setCentralWidget(self.centralwidget) QtCore.QMetaObject.connectSlotsByName(MainWindow) MainWindow.show() def build_table(self, title, x, y, x1, y1): # 创建局部表格实例,避免覆盖self.table table = QtWidgets.QTableWidget(self.centralwidget) table.setGeometry(QtCore.QRect(x, y, x1, y1)) table.setColumnCount(5) table.setRowCount(0) table.setObjectName(title) # 设置唯一标识,用于区分表格 table.verticalHeader().hide() table.horizontalHeader().setStretchLastSection(False) table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) table.horizontalHeader().hide() table.horizontalHeader().setDefaultSectionSize(10) table.verticalHeader().setDefaultSectionSize(25) # 插入表头行 t_row = 0 ttl_array = ['a','b','c','edit','e'] table.insertRow(t_row) for i in range(5): item = QTableWidgetItem(ttl_array[i]) # 表头不可编辑 item.setFlags(item.flags() & ~QtCore.Qt.ItemIsEditable) table.setItem(t_row, i, item) # 插入数据行 t_row += 1 while t_row <=5: table.insertRow(t_row) # 第0列:phone,不可编辑 cell = QTableWidgetItem('phone') cell.setFlags(cell.flags() & ~QtCore.Qt.ItemIsEditable) table.setItem(t_row, 0, cell) # 第1列:fax,不可编辑 cell = QTableWidgetItem('fax') cell.setFlags(cell.flags() & ~QtCore.Qt.ItemIsEditable) table.setItem(t_row, 1, cell) # 第2列:available,不可编辑 cell = QTableWidgetItem('available') cell.setFlags(cell.flags() & ~QtCore.Qt.ItemIsEditable) table.setItem(t_row, 2, cell) # 第3列:edit,允许编辑 cell = QTableWidgetItem(' ') # 保留编辑权限(默认允许,这里显式设置也可以) cell.setFlags(cell.flags() | QtCore.Qt.ItemIsEditable) table.setItem(t_row, 3, cell) # 第4列:busy,不可编辑 cell = QTableWidgetItem('busy') cell.setFlags(cell.flags() & ~QtCore.Qt.ItemIsEditable) table.setItem(t_row, 4, cell) t_row +=1 # 绑定单元格修改信号,触发处理方法 table.itemChanged.connect(self.on_table_item_changed) # 将表格添加到实例列表 self.tables.append(table) return 0 def on_table_item_changed(self, item): # 获取当前操作的表格 current_table = self.sender() # 确认是edit列(索引3)的修改 if item.column() ==3: print(f"编辑了表格:{current_table.objectName()},行号:{item.row()},内容:{item.text()}") def on_click(self): # 示例:遍历所有表格,获取edit列的内容 for table in self.tables: print(f"表格{table.objectName()}的edit列内容:") for row in range(1, table.rowCount()): item = table.item(row,3) print(f"行{row}:{item.text()}") def main(): app = QApplication(sys.argv) window = NewBook() window.show() sys.exit(app.exec_()) if __name__ == "__main__": main()
关键修改说明
- 表格引用管理:用
self.tables列表存储所有创建的表格,替代原代码中覆盖式的self.table,确保所有表格实例都能被访问 - 编辑权限控制:通过
item.setFlags()移除非edit列的ItemIsEditable标识,仅保留第3列的编辑权限 - 编辑事件追踪:绑定
itemChanged信号到on_table_item_changed方法,通过self.sender()获取当前操作的表格,结合objectName区分不同表格 - 唯一标识设置:给每个表格设置与传入title一致的
objectName,方便识别和定位
内容的提问来源于stack exchange,提问作者user17565490
相关产品推荐
相关产品推荐

