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

