您的位置:首页 > 其它

QSortFilterProxyModel简介及小例

2014-11-18 14:52 274 查看
QSortFilterProxyModel简介及小例
直接派生QAbstractProxyModel的子类方法足够灵活,但是需要实现两个数据集索引的映射,
并需要重载多个接口函数。如果这种映射只是对源模型中的数据项进行过滤或排序,可以使用Qt提供的
QSortFilterProxyModel.
在实现索引之间的映射时,该类考虑了过滤排序两种操作。关于过滤操作:成员函数setFilterKeyColumn(),
setFilterRegExp().关于排序,它重载了QAbstractItemModel的接口函数sort(),视图对象自动调用.
实例可参看Qt提供的demo,eg(mine):
C:\Qt\Qt5.3.2\Examples\Qt-5.3\widgets\itemviews\customsortfiltermodel
/****************************************************************************************************/
//colornamesdialog.h
#ifndef COLORNAMESDIALOG_H
#define COLORNAMESDIALOG_H
#include <QDialog>
#include <QSortFilterProxyModel>
#include <QStringListModel>
#include <QListView>
#include <QComboBox>
#include <QLineEdit>
class ColorNamesDialog : public QDialog
{
Q_OBJECT
public:
ColorNamesDialog(QWidget *parent = 0);
~ColorNamesDialog();
private slots:
void reapplyFilter();
private:
QSortFilterProxyModel *proxyModel;
QStringListModel *sourceModel;
QListView *listView;
QComboBox *syntaxComboBox;
QLineEdit *filterLineEdit;
};
#endif // COLORNAMESDIALOG_H
//colornamesdialog.cpp
#include "colornamesdialog.h"
#include <QLabel>
#include <QHBoxLayout>
#include <QVBoxLayout>
ColorNamesDialog::ColorNamesDialog(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("RegExp: ",QRegExp::RegExp);    //0
syntaxComboBox->addItem("Wildcard: ",QRegExp::Wildcard);  //1
syntaxComboBox->addItem("Fixed string",QRegExp::FixedString); //2
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 ColorNamesDialog::reapplyFilter(){
QRegExp::PatternSyntax syntax =
QRegExp::PatternSyntax(syntaxComboBox->currentIndex());
QRegExp regExp(filterLineEdit->text(),Qt::CaseInsensitive,syntax);
proxyModel->setFilterRegExp(regExp);
}
ColorNamesDialog::~ColorNamesDialog()
{
}
//main.cpp
#include "colornamesdialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ColorNamesDialog dialog;
dialog.setWindowTitle("My QSortFilterProxyModel Demo");
dialog.show();
return a.exec();
}
运行结果:
          

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: