如何为QTableWidget创建过滤器?

时间:2015-12-13 14:56:44

标签: python qt pyside qtableview qsortfilterproxymodel

我正在尝试在PySide中为QTableWidget创建一个过滤器QLineEdit。我已经看过一些使用QSortFilterProxyModel用于C ++的教程但无法理解如何在Python中使用它。

enter image description here

我需要搜索'VALUE'列。

1 个答案:

答案 0 :(得分:6)

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用作模型。

它看起来像:

No filtering

Filtering