Qt QSortFilterProxyModel示例代码, 使用方法
1. QSortFilterProxyModel不能单独使用,它只是一个“代理”,真正的数据需要另外的一个model提供,而且它是用来排序和过滤的。
2. 实现代码
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QtGui>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
public slots:
void reapplyFilter();
private:
QSortFilterProxyModel *proxyModel;
QStringListModel *sourceModel;
QListView *listView;
QComboBox *syntaxComboBox;
QLineEdit *filterLineEdit;
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
sourceModel = new QStringListModel(this);
sourceModel->setStringList(QColor::colorNames());
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(sourceModel);
proxyModel->setFilterKeyColumn(0);
listView = new QListView;
listView->setModel(proxyModel);
QLabel *filterLabel = new QLabel("Filter:", this);
filterLabel->setFixedWidth(100);
QLabel *patternLabel = new QLabel("Pattern syntax:", this);
patternLabel->setFixedWidth(100);
filterLineEdit = new QLineEdit(this);
syntaxComboBox = new QComboBox(this);
syntaxComboBox->addItem("Regular expression", QRegExp::RegExp);
syntaxComboBox->addItem("Wildcard", QRegExp::Wildcard);
syntaxComboBox->addItem("Fixed string", QRegExp::Wildcard);
QHBoxLayout *filterLayout = new QHBoxLayout;
filterLayout->addWidget(filterLabel);
filterLayout->addWidget(filterLineEdit);
QHBoxLayout *patternlayout = new QHBoxLayout;
patternlayout->addWidget(patternLabel);
patternlayout->addWidget(syntaxComboBox);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(listView);
mainLayout->addLayout(filterLayout);
mainLayout->addLayout(patternlayout);
setLayout(mainLayout);
connect(syntaxComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(reapplyFilter()));
connect(filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(reapplyFilter()));
}
void Dialog::reapplyFilter()
{
QRegExp::PatternSyntax syntax = QRegExp::PatternSyntax(syntaxComboBox->itemData(
syntaxComboBox->currentIndex()).toInt());
QRegExp regExp(filterLineEdit->text(), Qt::CaseInsensitive, syntax);
proxyModel->setFilterRegExp(regExp);
}
浙公网安备 33010602011771号