from PySide6.QtWidgets import QApplication,QWidget,QMainWindow,QVBoxLayout,QTextEdit,QPlainTextEdit,QPushButton,QLineEdit,QAbstractItemView,QTableWidgetItem,QTableWidget,QGridLayout,QCheckBox
# 关键字选择页面
def openSelectkeyWordPage(self):
self.keyPage = keyWordSelectPage()
self.keyPage.show()
self.keyPage.tableWidget.setRowCount(10)
self.keyPage.tableWidget.setColumnCount(4)
# self.keyPage.tableWidget.setSelectionBehavior(QAbstractItemView.SelectionMode)
# self.keyPage.tableWidget.setSelectionMode(QAbstractItemView.)
# self.keyPage.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
# 设置表头
item = QTableWidgetItem("是否选择")
# item.setTextAlignment(Qt.AlignmentFlag(20))
self.keyPage.tableWidget.setItem(0, 0, item)
item = QTableWidgetItem("log关键字")
self.keyPage.tableWidget.setItem(0, 1, item)
item = QTableWidgetItem("日志描述")
self.keyPage.tableWidget.setItem(0, 2, item)
# 填充表格数据
row = 1
col = 1
for name, score in self.mode_keyWord.items():
# 创建QCheckBox
checkBox = QCheckBox()
# 创建一个QWidget,并把QCheckBox作为子控件添加进去
widget = QWidget()
layout = QVBoxLayout(widget)
layout.addWidget(checkBox)
layout.setContentsMargins(0, 0, 0, 0)
widget.setLayout(layout)
# 创建一个QTableWidgetItem,并设置其数据为QWidget
item = QTableWidgetItem()
self.keyPage.tableWidget.setItem(row, 0, item)
# 将QWidget设置为表格的单元格的QWidget
self.keyPage.tableWidget.setCellWidget(row, 0, widget)
item = QTableWidgetItem(name)
self.keyPage.tableWidget.setItem(row, col, item)
item = QTableWidgetItem(score)
self.keyPage.tableWidget.setItem(row, col+1, item)
row += 1
# 检查复选框是否被选中
checkbox = tableWidget.cellWidget(row, 0) # 获取特定行的复选框
is_checked = checkbox.isChecked() # 检查复选框是否选中
# 设置表格不可编辑
# self.keyPage.tableWidget.closePersistentEditor(False)
self.keyPage.tableWidget.closeEditor(True)
# self.keyPage.tableWidget.setEditTriggers(QTableWidget.editItem(False))
# self.keyPage.tableWidget.setEditTriggers(QTableWidget.setEditTriggers(True))
class keyWordSelectPage(QWidget,Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.bind()
def bind(self):
self.pushButton_2.clicked.connect(self.cancel)
def cancel(self):
self.keyWordPage = keyWordSelectPage()
self.close()
pyqt5 tableWidget 筛选及排序功能实现(亲测可用)_pyqt5 tableview 搜索-CSDN博客
列表数据筛选
Python 实现tablewidget列表筛选
在Python中,使用PyQt5库可以实现QTableWidget的筛选功能。以下是一个简单的例子,展示了如何根据条件筛选QTableWidget中的数据。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class TableFilterProxyModel(QSortFilterProxyModel):
def __init__(self, parent=None):
super(TableFilterProxyModel, self).__init__(parent)
self.filter_text = ""
def setFilterText(self, text):
self.filter_text = text
self.invalidateFilter()
def filterAcceptsRow(self, row, parent):
model = self.sourceModel()
index = model.index(row, 0, parent)
return self.filter_text in model.data(index).text()
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.table_widget = QTableWidget()
self.setCentralWidget(self.table_widget)
self.filter_proxy_model = TableFilterProxyModel(self)
self.line_edit = QLineEdit()
self.line_edit.textChanged.connect(self.filter_proxy_model.setFilterText)
self.table_widget.setModel(self.filter_proxy_model)
self.filter_proxy_model.setSourceModel(self.table_widget.model())
layout = QVBoxLayout()
layout.addWidget(self.line_edit)
layout.addWidget(self.table_widget)
central_widget = QWidget()
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
# 填充TableWidget数据
self.table_widget.setRowCount(10)
for row in range(self.table_widget.rowCount()):
for column in range(3):
item = QTableWidgetItem("Item %d" % row)
self.table_widget.setItem(row, column, item)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
在这个例子中,我们定义了一个TableFilterProxyModel类,它继承自QSortFilterProxyModel。我们重写了setFilterText和filterAcceptsRow方法来实现自定义的筛选逻辑。filterAcceptsRow方法检查每行的第一列是否包含筛选文本。
在MainWindow中,我们创建了一个QTableWidget和一个QLineEdit,用于输入筛选文本。我们将QLineEdit的textChanged信号连接到自定义筛选模型的setFilterText方法。然后,我们设置QTableWidget的模型为我们自定义的筛选代理模型。
最后,我们填充了QTableWidget的数据,并设置了它的中央部件。当在QLineEdit中输入文本时,QTableWidget会实时更新显示筛选后的结果。
class selectKeyWordWidget(QWidget, Ui_Form):
# sendValueToSubWindow = Signal(str)
def __init__(self):
super().__init__()
self.setupUi(self)
self.tableInit()
self.bind()
def bind(self):
self.pushButton_close.clicked.connect(self.cancelClose)
self.pushButton_ok.clicked.connect(self.selectOK)
def tableInit(self):
self.tableWidget
self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
self.tableWidget.setRowCount(8)
self.tableWidget.setColumnCount(3)
self.tableWidget.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) # 禁止编辑单元格
self.tableWidget.setAlternatingRowColors(True) # 使表格颜色交错显示
# 设置表头
item = QTableWidgetItem("选择")
item.setBackground(QBrush(QColor("cyan"))) #设置单元格背景颜色
item.setFont
# item.setTextAlignment(Qt.AlignmentFlag(20))
self.tableWidget.setItem(0, 0, item)
item = QTableWidgetItem("log关键字")
item.setBackground(QBrush(QColor("cyan")))
self.tableWidget.setItem(0, 1, item)
item = QTableWidgetItem("描述")
item.setBackground(QBrush(QColor("cyan")))
self.tableWidget.setItem(0, 2, item)
# 设置字体(字体,字号,颜色)
# Item.setFont(QFont('Times', 14, QFont.Black))
# # 另外一种方法设置颜色(该为红色)
# Item.setForeground(QBrush(QColor(255, 0, 0)))
# tableWidget.setItem(0, 0, Item)
# 填充表格数据
row = 1
col = 1
print('更新表格关键字文件:',keyWordFlieDir + module_name)
module_keyWord = readJsonToDict(keyWordFlieDir + module_name)
for name, score in module_keyWord.items():
# 创建QCheckBox
checkBox = QCheckBox()
# 将QWidget设置为表格的单元格的QWidget
self.tableWidget.setCellWidget(row, 0, checkBox)
checkBox.stateChanged.connect(lambda state, row=row: self.on_checkbox_state_changed(row))
item = QTableWidgetItem(name)
self.tableWidget.setItem(row, col, item)
item = QTableWidgetItem(score)
self.tableWidget.setItem(row, col+1, item)
row += 1
self.tableWidget.resizeColumnsToContents() #设置列宽跟随内容改变
def on_checkbox_state_changed(self, row):
# 获取当前行的QCheckBox
checkBox = self.tableWidget.cellWidget(row, 0)
# 根据QCheckBox的状态进行操作
if checkBox.isChecked():
selectedKeyWord[self.tableWidget.item(row,1).text()] = self.tableWidget.item(row,2).text()
def cancelClose(self):
self.keyWordPage = selectKeyWordWidget()
self.close()
def selectOK(self):
mainWindow = MyWindow()
for name, scord in selectedKeyWord.items():
mainWindow.plainTextEdit.appendPlainText(name +':'+ scord)
mainWindow.plainTextEdit.appendPlainText('已经选择关键字:' + str(selectedKeyWord))