Qt学习之路(44): QSortFilterProxyModel

简介:
Qt为我们预定义了很多model,前面已经说过了QStringListModel、QDirModel(也算是Qt推荐使用的QFileSystemModel吧,这个在上一章最后重新加上了一段话,没有注意的朋友去看看哦)。今天我们要说的这个QSortFilterProxyModel并不能单独使用,看它的名字就会知道,它只是一个“代理”,真正的数据需要另外的一个model提供,并且它是用来排序和过滤的。所谓过滤,也就是说按照你输入的内容进行数据的筛选,很像Excel里面的过滤器。不过Qt提供的过滤功能是基于正则表达式的,因而功能强大。
 
我们从代码开始看起:
 
sortview.h
#ifndef SORTVIEW_H 
#define SORTVIEW_H 
 
#include <QtGui> 
 
class SortView :  public QWidget 

        Q_OBJECT 
public
        SortView(); 
 
private
        QListView *view; 
        QStringListModel *model; 
        QSortFilterProxyModel *modelProxy; 
        QComboBox *syntaxBox; 
 
private slots: 
         void filterChanged(QString text); 
}; 
 
#endif  // SORTVIEW_H
 
sortview.cpp
#include  "sortview.h" 
 
SortView::SortView() 

        model =  new QStringListModel(QColor::colorNames(),  this); 
 
        modelProxy =  new QSortFilterProxyModel( this); 
        modelProxy->setSourceModel(model); 
        modelProxy->setFilterKeyColumn(0); 
 
        view =  new QListView( this); 
        view->setModel(modelProxy); 
 
        QLineEdit *filterInput =  new QLineEdit; 
        QLabel *filterLabel =  new QLabel(tr( "Filter")); 
        QHBoxLayout *filterLayout =  new QHBoxLayout; 
        filterLayout->addWidget(filterLabel); 
        filterLayout->addWidget(filterInput); 
 
        syntaxBox =  new QComboBox; 
        syntaxBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); 
        syntaxBox->addItem(tr( "Regular expression"), QRegExp::RegExp); 
        syntaxBox->addItem(tr( "Wildcard"), QRegExp::Wildcard); 
        syntaxBox->addItem(tr( "Fixed string"), QRegExp::FixedString); 
        QLabel *syntaxLabel =  new QLabel(tr( "Syntax")); 
        QHBoxLayout *syntaxLayout =  new QHBoxLayout; 
        syntaxLayout->addWidget(syntaxLabel); 
        syntaxLayout->addWidget(syntaxBox); 
 
        QVBoxLayout *layout =  new QVBoxLayout( this); 
        layout->addWidget(view); 
        layout->addLayout(filterLayout); 
        layout->addLayout(syntaxLayout); 
 
        connect(filterInput, SIGNAL(textChanged(QString)),  this, SLOT(filterChanged(QString))); 

 
void SortView::filterChanged(QString text) 

        QRegExp::PatternSyntax syntax = QRegExp::PatternSyntax( 
                        syntaxBox->itemData(syntaxBox->currentIndex()).toInt()); 
        QRegExp regExp(text, Qt::CaseInsensitive, syntax); 
        modelProxy->setFilterRegExp(regExp); 
}
 
至于main()函数的内容,由于和前面的代码几乎是一样的,这里就不再贴出来了。我们使用的是QColor::colorNames()函数提供的数据。这个函数返回值是一个QStringList类型的变量,可以给出预定义的颜色的名字。我们使用一个QStringListModel包装这个数据,这和前面的内容没有什么区别。然后创建一个QSortFilterProxyModel对象,使用它的setSourceModel()函数将前面定义的QStringListModel传进去,也就是我们需要对这个model进行代理。那么我们需要过滤哪一列呢?虽然QStringListModel只有一列,但是我们也需要使用setFilterKeyColumn()函数设置一下,以便让这个proxy知道要过滤的是第0列。最后重要的一点是,QListView的model必须设置为QSortFilterProxyModel,否则是看不到效果的。
 
下面的QLineEdit提供过滤数据的输入,这个没什么好说的。后面的QComboBox列出了三项:
 
syntaxBox->addItem(tr( "Regular expression"), QRegExp::RegExp); 
syntaxBox->addItem(tr( "Wildcard"), QRegExp::Wildcard); 
syntaxBox->addItem(tr( "Fixed string"), QRegExp::FixedString);
 
这是正则表达式的类型。正则表达式有一套通用的语法,但是对于不同的环境,正则表达式的规则可能是不一样的。第一个QregExp::RegExp提供了最一般的正则表达式语法,不过这个语法不支持贪婪限定符。这也是Qt默认的规则。如果你需要使用贪婪限定符,需要使用QRegExp::RegExp2,根据文档描述,这个将会是 Qt5 的默认规则。第二个是Unix下shell很常见的一种规则。第三个即固定表达式,也就是说基本上不使用正则表达式的。
 
我们使用connect()函数,将QLineEdit的textChanged()信号同slot连接起来。其中我们的slot函数如下所示:
 
void SortView::filterChanged(QString text) 

        QRegExp::PatternSyntax syntax = QRegExp::PatternSyntax( 
                        syntaxBox->itemData(syntaxBox->currentIndex()).toInt()); 
        QRegExp regExp(text, Qt::CaseInsensitive, syntax); 
        modelProxy->setFilterRegExp(regExp); 
}
 
第一步,使用QComboBox的选择值创建一个QRegExp::PatternSyntax对象,然后利用这个语法规则构造一个正则表达式,注意我们在QLineEdit里面输入的内容是通过参数传递进来的,然后设置proxy的过滤器的表达式。好了,就这样运行一下看看效果吧!
 

本文转自 FinderCheng 51CTO博客,原文链接:
http://blog.51cto.com/devbean/266500

相关文章
|
Linux C语言
[学习][笔记] qt5 从入门到入坟:<一>hello Qt
[学习][笔记] qt5 从入门到入坟:<一>hello Qt
|
12月前
|
定位技术 Go 开发工具
dynamic-situational-awareness-qt学习记录
本文是作者yantuguiguziPGJ关于dynamic-situational-awareness-qt学习记录的分享,介绍了在Qt学习过程中发现的qml资源丰富的代码仓库,并提供了资源路径和相关的安装、配置步骤,涉及的内容有数字地球、GIS纹理等,同时提供了相关链接和git命令来克隆代码仓库和ArcGIS Runtime SDK for Qt的安装说明。
Qt中的信号与槽如何学习?(包括自定义信号)这篇文章告诉你
以现实中的事件来举例的话,例如有两把不同颜色的信号枪,分别是红色,绿色,打响不通颜色的信号枪会触发不同的槽发生,比如说打响红色这个人就跑步,绿色就走步,但是还有一个很重要的机制,那就是连接,我们需要把信号枪去跟这个人的动作连接起来。 如果上面理解没问题的话我们可以把信号和槽看成两个工具,我们最重要的是如何去把这两个工具连接起来。 它的作用可以让我们更加灵活的去使用不同窗口间的切换以及某些事件的连接。
241 0
|
开发者
Qt中的事件该如何学习?(附带案例)
事件是Qt中比较重要的一部分,在初期如果理解不当学习可能会比较困难,这里提一嘴当初教我的那位老师水平是真的高,让我很轻易的就理解了事件的概念。 在平时我们见到那些界面上的某些快捷键就有可能是事件做的,例如ESC关闭窗口,Enter提交或者登录这种类似的,这也是事件的强大之处。
451 0
|
API
QT学习—属于自己的串口调试助手
本文详细介绍了如何编写一个属于自己的串口助手。
1631 3
|
编解码 开发框架 Linux
Qt入门学习
学习Qt并使用Qt
397 0
Qt入门学习
[学习][笔记] qt5 从入门到入坟:《零》vs开发qt项目
[学习][笔记] qt5 从入门到入坟:《零》vs开发qt项目
144 0
|
定位技术 图形学
[学习][笔记] qt5 从入门到入坟:<13>基于GraphicsViewFrame的贪吃蛇实现
[学习][笔记] qt5 从入门到入坟:<13>基于GraphicsViewFrame的贪吃蛇实现
125 0
|
图形学
[学习][笔记] qt5 从入门到入坟:<12>Graphics View Framework
[学习][笔记] qt5 从入门到入坟:<12>Graphics View Framework
126 0
|
编解码 图形学
[学习][笔记] qt5 从入门到入坟:<11>绘制设备
[学习][笔记] qt5 从入门到入坟:<11>绘制设备
108 0

推荐镜像

更多
  • qt