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

PyQt5 QTableWidget两列分组分配实现及单值问题咨询

解决方案:QTableWidget多列批量匹配处理(无需修改生成代码)

核心思路

因为无法修改自动生成的Ui_MainWindow代码,我们通过继承QMainWindow并包装Ui类的方式,重新实现输入框的信号处理逻辑,实现两列的分组批量操作:

  • 输入框1(placeholder"1")对应表格第0列,输入值后选中该列所有匹配值的单元格
  • 输入框2(placeholder"4")对应表格第3列,输入值后选中该列所有匹配值的单元格

完整示例代码

from PyQt5 import QtCore, QtWidgets
# 保留原生成的Ui_MainWindow代码,不做修改
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1920, 1000)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(10, 40, 131, 20))
        self.lineEdit.setInputMask("")
        self.lineEdit.setText("")
        self.lineEdit.setPlaceholderText("1")
        self.lineEdit.textChanged.connect(self.add1)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(10, 100, 131, 20))
        self.lineEdit_2.setInputMask("")
        self.lineEdit_2.setPlaceholderText("4")
        self.lineEdit_2.textChanged.connect(self.add2)
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(200, 0, 1720, 1000))
        Row = 35
        self.row = Row
        Col = 7
        self.tableWidget.setRowCount(Row)
        self.tableWidget.setColumnCount(Col)
        self.tableWidget.setObjectName("tableWidget")
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(4, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(5, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(6, item)
        self.tableWidget.horizontalHeader().setDefaultSectionSize(237)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1920, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        
        
        for column in range(Col):
            for row in range(Row):
                s = self.lineEdit.setText("")
                item = QtWidgets.QTableWidgetItem(s)
                self.tableWidget.setItem(row, column, item)
    
                
        for a in range(7):
            for b in range(Row):
                c = self.lineEdit_2.setText("")
                i1 =  QtWidgets.QTableWidgetItem(c)
                self.tableWidget.setItem(a, b, i1)
                
    def add1(self, s):
        for row in range(self.row):
            if self.tableWidget.item(row,0).text() == s:
                self.tableWidget.editItem(self.tableWidget.item(row, 0))
            
                
    def add2(self, c):
        itims = self.tableWidget.findItems(c, QtCore.Qt.MatchContains)
        if itims: 
            self.tableWidget.setCurrentItem(itims[0])

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "1"))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("MainWindow", "2"))
        item = self.tableWidget.horizontalHeaderItem(2)
        item.setText(_translate("MainWindow", "3"))
        item = self.tableWidget.horizontalHeaderItem(3)
        item.setText(_translate("MainWindow", "4"))
        item = self.tableWidget.horizontalHeaderItem(4)
        item.setText(_translate("MainWindow", "5"))
        item = self.tableWidget.horizontalHeaderItem(5)
        item.setText(_translate("MainWindow", "6"))
        item = self.tableWidget.horizontalHeaderItem(6)
        item.setText(_translate("MainWindow", "7"))

# 新增主窗口类,包装Ui类,实现自定义逻辑
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        
        # 断开原信号连接,替换为自定义方法
        self.ui.lineEdit.textChanged.disconnect(self.ui.add1)
        self.ui.lineEdit.textChanged.connect(self.custom_add1)
        
        self.ui.lineEdit_2.textChanged.disconnect(self.ui.add2)
        self.ui.lineEdit_2.textChanged.connect(self.custom_add2)
        
        # 设置表格支持多选
        self.ui.tableWidget.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)

    def custom_add1(self, s):
        """处理第0列的匹配项:选中所有匹配单元格,若为空则取消选中"""
        self.ui.tableWidget.clearSelection()
        if not s:
            return
        
        for row in range(self.ui.row):
            item = self.ui.tableWidget.item(row, 0)
            if item and item.text() == s:
                item.setSelected(True)
                # 如果需要进入编辑状态,可打开下面注释,但同一时间只能编辑一个单元格
                # self.ui.tableWidget.editItem(item)

    def custom_add2(self, c):
        """处理第3列的匹配项:选中所有包含输入值的单元格"""
        self.ui.tableWidget.clearSelection()
        if not c:
            return
        
        for row in range(self.ui.row):
            item = self.ui.tableWidget.item(row, 3)
            if item and c in item.text():
                item.setSelected(True)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

关键说明

  1. 不修改生成代码:通过继承QMainWindow包装Ui类,断开原信号连接后替换为自定义逻辑,完全保留自动生成的代码
  2. 多选支持:设置表格为MultiSelection模式,允许同时选中多个单元格
  3. 分组处理:
    • custom_add1专门处理第0列(对应输入框1),精准匹配输入值,选中所有符合条件的单元格
    • custom_add2专门处理第3列(对应输入框2),模糊匹配输入值,选中所有包含该值的单元格
  4. 编辑逻辑说明:如果需要让匹配的单元格进入编辑状态,由于Qt同一时间只能有一个单元格处于编辑状态,建议只让第一个匹配项进入编辑,或者通过循环延迟处理(但实际使用中多选编辑更常用的是批量修改值,若需要可额外添加批量赋值逻辑)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:06:32