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.フィルターをユーザーに作成してもらう
長くなるので次回に書きます。