2011年12月14日水曜日

( Qt C++ )QSortFilterProxyModelのリストビューへの表示


はい、本日最後の投稿です。
今回はQSortFilterProxyModelを使います。これは他のモデルと異なり、ソートや正規表現によるフィルター処理などをサポートします。よって便利です。
コードはC++ GUI Programming with Qt4のサンプルを一部変更して使います。なお、QListViewはすでに定義してあるものとします。ではコードを

(C++ GUI Programming with Qt4 229ページより一部変更して使用)

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)//uiでGUI部品の記述
{
    ui->setupUi(this);//uiでGUI部品の初期化

    QStringListModel *sourceModel = new QStringListModel;
    sourceModel->setStringList(QColor::colorNames());

    QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel;
    proxyModel->setSourceModel(sourceModel);
    proxyModel->setFilterKeyColumn(0);//フィルタリング対象はカラム0とする

    QRegExp regExp("gr[ae]y", Qt::CaseInsensitive, QRegExp::RegExp );
    proxyModel->setFilterRegExp(regExp);//正規表現をセットしフィルタリングする

    ui->listView->setModel(proxyModel);
}

uiの部分は前回と同じなので省略します。
まずQColorの色の名前をソースとしたQstringListModelを作成します。 次に最初に作ったQStringListModelをソースとしてQSortFilterProxyModelを作成します。proxyModel->setFilterKeyColumn(0)でソースモデルのカラム0にフィルタリング処理を行うことを指定しています。
次にフィルタリングに使う正規表現 を作成しています。"gray","grey"にマッチするものを抽出するという設定にしています。QRegExpについてはリファレンスを見てください。ここでは説明しません。
次にこの正規表現をproxyModel->setFilterRegExp(regExp);でソースモデルに適用しています。
フィルターを適用した後QListViewにモデルをセットしています。
実行すると下記のようになります。
 
 以上です。次回はアイテムビュー関連ですが未定です。