当前位置: 首页 > news >正文

Qt学习之路(44): QSortFilterProxyModel

版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://devbean.blog.51cto.com/448512/266500
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的过滤器的表达式。好了,就这样运行一下看看效果吧!

本文出自 “豆子空间 ” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/266500

相关文章:

  • UIimage图片在程序Documents目录下的存取
  • Qt学习之路(43): QDirModel
  • java “==”和“ equals”以及instanceof的区别
  • Qt学习之路(42): QStringListModel
  • The Clocks
  • 发布app store流程
  • Qt学习之路(41): QTableWidget
  • Qt学习之路(40): QTreeWidget
  • 配置EM遇到的问题
  • Qt学习之路(38): model-view架构
  • MAGENTO EVENT OBSERVER
  • Qt学习之路(39): QListWidget
  • iTextSharp 使用详解(转)
  • Qt学习之路(37): Qt容器类之关联存储容器
  • js随笔小技巧
  • __proto__ 和 prototype的关系
  • Bytom交易说明(账户管理模式)
  • express.js的介绍及使用
  • Facebook AccountKit 接入的坑点
  • HomeBrew常规使用教程
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Theano - 导数
  • Vim 折腾记
  • 产品三维模型在线预览
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 前端性能优化——回流与重绘
  • 使用SAX解析XML
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小程序开发中的那些坑
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 用Visual Studio开发以太坊智能合约
  • 自动记录MySQL慢查询快照脚本
  • ​人工智能书单(数学基础篇)
  • # 计算机视觉入门
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #宝哥教你#查看jquery绑定的事件函数
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (1)虚拟机的安装与使用,linux系统安装
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (转)负载均衡,回话保持,cookie
  • (转)平衡树
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .sh 的运行
  • /var/spool/postfix/maildrop 下有大量文件
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [Android Pro] Notification的使用