如何为 QTableWidget 创建过滤器?
Posted
技术标签:
【中文标题】如何为 QTableWidget 创建过滤器?【英文标题】:How to create a filter for QTableWidget? 【发布时间】:2015-12-13 14:56:44 【问题描述】:我正在尝试在 PySide 中使用QLineEdit
为QTableWidget
创建一个过滤器。我已经看过一些使用 QSortFilterProxyModel
用于 C++ 的教程,但不明白如何在 Python 中做到这一点。
我需要在“VALUE”列中进行搜索。
【问题讨论】:
所有 Qt 示例都已转换为 Python。它们包含在 PyQt(或 PySide)的源代码包中,您可以下载 here。查找basicsortfiltermodel.py
示例。
PyQt5 examples, PyQt4 examples.
【参考方案1】:
QSortFilterProxyModel
是代理模型,这意味着您将它放在完整的数据模型和视图之间。 titusjan 的评论很好,您可以在本地 PySide/PyQt 安装中查找 basicsortfiltermodel.py
以获取 Python 示例。
另外,除了使用QTableWidget
之外,QTableView
就足够了 - 无论如何您都不需要 QTableWidget
的内置模型。
QTableWidget:Details
QTableWidget 类提供了一个带有默认模型的基于项目的表格视图。
表格小部件为应用程序提供标准表格显示工具。 QTableWidget 中的项目由 QTableWidgetItem 提供。
如果你想要一个使用你自己的数据模型的表,你应该使用 QTableView 而不是这个类。
我编写了一个非常简单的示例,展示了对QTableView
的第三列的过滤:
from PySide import QtCore, QtGui
app = QtGui.QApplication([])
window = QtGui.QWidget()
# standard item model
model = QtGui.QStandardItemModel(5, 3)
model.setHorizontalHeaderLabels(['ID', 'DATE', 'VALUE'])
for row, text in enumerate(['Cell', 'Fish', 'Apple', 'Ananas', 'Mango']):
item = QtGui.QStandardItem(text)
model.setItem(row, 2, item)
# filter proxy model
filter_proxy_model = QtGui.QSortFilterProxyModel()
filter_proxy_model.setSourceModel(model)
filter_proxy_model.setFilterKeyColumn(2) # third column
# line edit for filtering
layout = QtGui.QVBoxLayout(window)
line_edit = QtGui.QLineEdit()
line_edit.textChanged.connect(filter_proxy_model.setFilterRegExp)
layout.addWidget(line_edit)
# table view
table = QtGui.QTableView()
table.setModel(filter_proxy_model)
layout.addWidget(table)
window.show()
app.exec_()
您有一个QStandardItemModel
,它被设置为QSortFilterProxyModel
的源,它使用第三列进行过滤,并使用QLineEdit
的输入作为过滤表达式。 QSortFilterProxyModel
被 QTableView
用作模型。
它看起来像:
【讨论】:
感谢您的回答,table.setModel 方法我无法使用,因为我在 calss 和它的私有方法中使用它,我该怎么办? 我将表格更改为 QTableView 并且可以正常工作!但是有办法用 QTableWidget 做到这一点吗? @snir.tur 您不能使用 QTableWidget,因为它具有不可更改的内置模型。 QTableView 是完美的替代品。要么使用它,要么你不能做你想做的事。 如何过滤整个单词?例如,您有“A”并得到“Apple”和“Ananas”,我希望它必须是 =“Apple”。以上是关于如何为 QTableWidget 创建过滤器?的主要内容,如果未能解决你的问题,请参考以下文章
QT编程,如何用代码实现 QTableWidget中滚动条的移动