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();
}
运行结果:
相关文章推荐
- QSortFilterProxyModel实现QTreeView的过滤的缺点和改进
- QSortFilterProxyModel--44
- QSortFilterProxyModel
- QSortFilterProxyModel实现数据筛选
- QSortFilterProxyModel
- QSortFilterProxyModel
- Qt学习之路(44): QSortFilterProxyModel
- Qt学习记录,QSortFilterProxyModel
- Qt学习之路(44): QSortFilterProxyModel
- 基于QSortFilterProxyModel实现表格数据查询排序框架
- qt 代理模型 proxy model QSortFilterProxyModel
- Qt学习之路(44): QSortFilterProxyModel
- Qt学习:项视图类之QSortFilterProxyModel和QListWidget
- Qt学习之路(44): QSortFilterProxyModel
- How to use Qt’s QSortFilterProxyModel
- QSortFilterProxyModel的使用
- Subclass QSortFilterProxyModel
- Qt之QHeaderView自定义排序(QSortFilterProxyModel)
- QT的排序与过滤(QSortFilterProxyModel)
- QSortFilterProxyModel Class