如何为 QTableWidget 创建过滤器?

Posted

技术标签:

【中文标题】如何为 QTableWidget 创建过滤器?【英文标题】:How to create a filter for QTableWidget? 【发布时间】:2015-12-13 14:56:44 【问题描述】:

我正在尝试在 PySide 中使用QLineEditQTableWidget 创建一个过滤器。我已经看过一些使用 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 的输入作为过滤表达式。 QSortFilterProxyModelQTableView 用作模型。

它看起来像:

【讨论】:

感谢您的回答,table.setModel 方法我无法使用,因为我在 calss 和它的私有方法中使用它,我该怎么办? 我将表格更改为 QTableView 并且可以正常工作!但是有办法用 QTableWidget 做到这一点吗? @snir.tur 您不能使用 QTableWidget,因为它具有不可更改的内置模型。 QTableView 是完美的替代品。要么使用它,要么你不能做你想做的事。 如何过滤整个单词?例如,您有“A”并得到“Apple”和“Ananas”,我希望它必须是 =“Apple”。

以上是关于如何为 QTableWidget 创建过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Qt 创建自定义小部件

如何为非 Qt 应用程序创建 Qt 共享库

QT编程,如何用代码实现 QTableWidget中滚动条的移动

如何为整个 Qt 应用程序创建一个菜单?

我如何为 Android 和 QT 创建者使用 RTL SDR 库?

Qt QTableWidget的用法