[Qt]QTableViewカラムフィルター

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.フィルターをユーザーに作成してもらう

長くなるので次回に書きます。

コメントを残す

メールアドレスが公開されることはありません。