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

如何识别三个QTableWidget中哪个的edit列被用户编辑?

解决QTableWidget编辑列限制与表识别问题

问题核心

  1. 原代码中每次调用build_table都会用self.table覆盖前一个表的引用,导致无法追踪所有创建的表格
  2. 未设置仅edit列(索引3)可编辑,所有单元格默认允许编辑
  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()

关键修改说明

  1. 表格引用管理:用self.tables列表存储所有创建的表格,替代原代码中覆盖式的self.table,确保所有表格实例都能被访问
  2. 编辑权限控制:通过item.setFlags()移除非edit列的ItemIsEditable标识,仅保留第3列的编辑权限
  3. 编辑事件追踪:绑定itemChanged信号到on_table_item_changed方法,通过self.sender()获取当前操作的表格,结合objectName区分不同表格
  4. 唯一标识设置:给每个表格设置与传入title一致的objectName,方便识别和定位

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:16:09