QtでExcelみたいなフィルターがほしいということがあったので、実装していきます。
全体に対する処理が主になりますので、QTableViewを使います。
modelの方が処理が速いのとmodelに対するフィルターのクラスがあるので、楽です。
使用する主なクラスは、QSortFilterProxyModelです。
QsortFilterProxyModelに元になるモデルをセットして、カラムとカラムに対する式を設定するとフィルターになってくれます。
問題は、1カラムしか設定できないところです。
カラムA = 1
カラムB = 2
という二つの条件を一つのクラスで行うことはできません。
なので、filterモデルをソースとして、もう一度フィルターにかけます。
QSortFilterProxyModelには、正規表現が使えるので便利です。
どんどん使っていきましょう。
model = QStandardItemModel(self)
for rowName in range(3) * 5:
model.invisibleRootItem().appendRow(
[QtGui.QStandardItem("row {0} col {1}".format(rowName, column))
for column in range(3)])
fmodel = set_filter(0, ['row 0 col 0', 'row 0 col 1'], model)
fmodel = set_filter(1, ['row 1 col 0', 'row 1 col 1'], fmodel)
def set_filter(self, index, filter_texts, model):
regexp = QtCore.QRegExp()
# Qtの正規表現クラス
escape_texts = [regexp.escape(text.replace(u'(空白)', u''))
for text in filter_texts]
# 値が空の物を'(空白)'と表記しているので置換
filter_word = u'^({0})$'.format(u'|'.join(escape_texts))
# 完全一致の正規表現にする
regexp.setCaseSensitivity(QtCore.Qt.CaseSensitive)
regexp.setPattern(filter_word)
proxy = QtGui.QSortFilterProxyModel(self)
proxy.setSourceModel(target_proxy)
# フィルターをかける元モデルを設定
proxy.setFilterRegExp(regexp)
# フィルターに使用する式(正規表現)を設定
proxy.setFilterKeyColumn(index)
# フィルターをかけるカラムを設定
return proxy
あとは、
1.ヘッダーをクリックして、フィルターダイアログを出現させる
2.フィルターダイアログ内に、ユニークのリストを表示させる
3.フィルターをユーザーに作成してもらう
長くなるので次回に書きます。