Qt学习之路(44): QSortFilterProxyModel

QT学习笔记 阅读详情
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

【QT开发】排序和过滤代理模型QSortFilterProxyModel类详解及实战应用 QSortFilterProxyModel是Qt提供的一个功能强大且灵活的排序和过滤代理模型类,通过本篇文章的学习,你应该对QSortFilterProxyModel有了全面的理解,能够在自己的项目中正确使用它。QSortFilterProxyModel在用户界面中帮助你更好地管理和操作数据模型,实现交互式和响应式的数据展示,有助于创建用户友好和高效的表格数据排序、树状结构过滤等应用场景。 阅读详情

相关推荐

Qt中的QSortFilterProxyModel类

在本例中,我们将创建一个QStandardItemModel模型,并使用QSortFilterProxyModel类对该模型进行排序和过滤。最后,我们遍历了过滤后的模型数据并输出。一般来说,我们需要在代理模型中实现filterAcceptsRow()函数来进行过滤操作,该函数将源模型的行号作为参数传入,如果符合过滤条件则返回true,否则返回false。通过以上实例,我们可以看到,QSortFilterProxyModel类可以很方便地提供数据排序和过滤的功能,使得我们可以更加灵活和便捷地对模型进行处理。

ByteBuster的博客 493

Qt模型视图框架:QSortFilterProxyModel

一、描述 QSortFilterProxyModel 可用于对项目进行排序、过滤。该模型而无需对底层数据进行任何转换,也无需复制内存中的数据。 要对自定义模型提供的项目进行排序和过滤。需要创建一个 QSortFilterProxyModel,以 MyItemModel 作为参数调用 setSourceModel(),并在视图上安装 QSortFilterProxyModel: QTreeView *treeView = new QTreeView; MyItemMod

友善啊,朋友的博客 1万+

QML中使用QSortFilterProxyModel进行排序和过滤

自定义的model继承自QAbstractListModel,如何自定义model,可参考Qt官方demo——contactlist这里使用自定义的model,加上自定义的SearchSortFilterProxyModel来实现搜索,效果如下所示从效果图中可以看到,列表有1000行,每行都包括用户ID和用户名,我们将使用用户ID进行排序,使用用户名进行过滤(搜索)首先要在自定义的QHListModel中分别设置用户ID和用户名对应的roleenumRoles{};{.........

草上爬的博客 5242

QSortFilterProxyModel实现排序、过滤

使用QRegExp对象指定筛选器,并将筛选器应用于给定列的每个项的filterRole() (默认情况下为Qt::DisplayRole)。以实现"只要第一列有整数或者第三列有整数的都显示出来"为例,首先需要子类化QSortFilterProxyModel类,然后重写filterAcceptsRow()或者filterAcceptsColumn()函数.由于我们筛选第一列和第三列,列号是明确的,而行号是未知的, 所以我们只重写filterAcceptsRow()函数.

wisdomroc的博客 1万+

从零构建高精度温控系统:ADN8835的单电感拓扑与0.01℃稳定性实战解析

本文深入解析了如何利用ADN8835构建高精度温控系统,重点介绍了其创新的单电感拓扑架构如何实现0.01℃的长期稳定性。内容涵盖精密PCB布局、电源滤波设计,并详细阐述了针对不同热容负载的数字PID控制参数整定策略,为开发精密仪器和医疗设备提供了实战指南。

r2s3t4的博客 238

XGBoost算法案例 - 红酒品质分类

数据集共包含 11 个特征,共计 3269 条数据. 我们通过训练模型来预测红酒的品质, 品质共有 6 个各类别,分别使用数字: 0、1、2、3、4、5 来表示。

YIAN爱学习的博客 449

QSortFilterProxyModel--44

Qt为我们预定义了很多model,前面已经说过了QStringListModel、QDirModel(也算是Qt推荐使用的 QFileSystemModel吧,这个在上一章最后重新加上了一段话,没有注意的朋友去看看哦)。今天我们要说的这个 QSortFilterProxyModel并不能单独使用,看它的名字就会知道,它只是一个“代理”,真正的数据需要另外的一个model提供,并且它 是用来排序和过滤的。所谓过滤,也就是说按照你输入的内容进行数据的筛选,很像Excel里面的过滤器。不过Qt提供的过滤功能

啃骨头的小蚂蚁 683

Mac版Burp Suite专业版破解与汉化完整指南

在Web安全测试领域,Java应用程序的许可证验证机制与本地化实现是常见的技术课题。其原理通常涉及Java Agent技术,通过在JVM启动时动态修改字节码,实现对软件授权状态的校验逻辑进行拦截与重写,从而绕过官方验证。同时,软件界面的国际化(i18n)与本地化(l10n)则依赖于资源文件的替换与加载。从技术价值角度看,深入理解这些机制不仅能满足特定场景下的工具定制需求,更能加深对Java安全机制、软件保护与逆向工程的理解。在实际的工程实践中,安全研究人员与开发者常面临功能受限或语言障碍的挑战,尤其是在渗透

weixin_29327525的博客 1037

Qt表格入门

摘要     表格作为数据展示的界面,会在很多场景下使用。Qt为我们提供了使用简单方便和扩展性强的表格视图,这里做一个简单的入门整理。     个人能力有限,有错误欢迎留言指正,如果你有更好的方法,也欢迎分享讨论。 关键词     Qt、表格、过滤、筛选、自定义单元格、排序、委托、代理 主要类     QTableWidget、QTableView、QStandardItemModel、Q...

weixin_35421203的博客 1162

DataGridView 右键菜单复制(公共)

dataGridView1.CellMouseClick += new DataGridViewCellMouseEventHandler( (sender1, e1) => { if (e1.Button == MouseButtons.Right) {

沁心渃水 2832

零基础实战:用 Docker 和 vLLM 本地部署 BGE-M3 文本嵌入模型

BGE-M3是北京智源推出的多功能文本嵌入模型,支持跨语言语义匹配。利用Docker容器化和vLLM框架可高效部署该模型,实现本地运行的优势包括隐私保护、定制化和成本控制。通过配置Docker环境,使用vLLM官方镜像加载模型,并进行文本嵌入测试验证效果。该方案适合开发者快速验证模型能力,或集成到本地NLP流程中。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 4953

模型视图(102):【例】Basic Sort Filter Model Example[官翻]

文章目录main.cppWindow类Window.hWindow.cpp Basic Sort/Filter Model Example 基本排序/筛选模型示例说明了如何使用QSortFilterProxyModel来执行基本排序和筛选。 main.cpp #include "window.h" #include <QApplication> #include <QStandardItemModel> #include <QTime> // 增加一条信息 void

读书笔记 237

嵌入式工程师成长之路(10)——项目举例

送给大学毕业后找不到奋斗方向的你(每周不定时更新)

云轩阁 5万+

《Qt基础教程之Qt学习之路》

在Qt开源社区中,有一个很好的Qt教程,叫做《Qt 学习之路》,下面是它的链接和目录。 链接地址:http://www.qter.org/thread-629-1-1.html 目录 第1篇 序 第2篇 Qt简介 第3篇Hello, world! 第4篇 信号槽 第5篇 自定义信号槽 第6篇 Qt模块简介 第7篇MainWindow 简介 第8篇 添加动作 第9篇 资源文件 ...

u011996698的博客 601

ollama使用CPU安装qwen-coder模型_并在eclipse中使用ai coder插件_配置本地qwen-coder模型_ollama常用操作记录---AI大模型应用探索0002

文章摘要:作者分享了在Windows 10上安装和使用Ollama模型的过程。尝试了不同规模的qwen-coder模型(7b、1.5b和0.5b),发现7b模型响应极慢(需35分钟),而1.5b模型表现较好(3秒响应)。最终选择1.5b版本用于代码开发辅助,支持多语言自动补全。同时提到在最新版Eclipse中的AIcoder配置问题。文章重点比较了不同模型规模在CPU环境下的实际使用体验和响应速度差异。

添柴程序猿的专栏 683

基于STM32F103设计的智能门锁(支持多种开锁解锁方式)

这个智能锁模型是基于STM32平台开发的,支持多种开锁方式。其中,一种是使用RC522射频卡读卡器读取IC卡卡号和内部数据,并验证身份后开锁;另一种是通过连接蓝牙地址来确认业主身份,实现了蓝牙自动开锁功能;最后一种是通过ESP8266连接腾讯云物联网平台,并且用户可以通过微信小程序“腾讯连连”进行远程开锁和关锁。这样,用户就可以选择最方便的方式来进行开锁操作了。

3万+

Qt之自定义检索框

今天这篇文章主要讲解的是自定义搜索框,不仅仅支持搜索,而且可以支持搜索预览,具体请看效果图1。网上也有一些比较简单明了的自定义搜索框,比如Qt之自定义搜索框 ,讲的也比较详细,不过本文的侧重点不仅仅是搜索,而且包括了检索功能。上边4个类是完成自定义搜索框的自定义类,当然除了上述4个类以外,还用到了qt自带的一些类,更好的理解这些类,那么这个自定义控件的思路也就显得异常好理解。显示时机:编辑框内容发现变化的时候显示,编辑框失去焦点的时候隐藏,这样也就存在一个问题,当主窗口拖动时,视图位置更新怎么做?

hw5230的博客 790

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

获取过滤数据

要获取并过滤数据,可以使用 Python 处理各种数据格式(如 JSON、CSV 等)。以下是一些示例,演示如何从文件中获取数据并根据特定条件进行过滤。1、问题背景在 Qt 中,QSortFilterProxyModel 用于对数据进行过滤和排序。当您使用 QSortFilterProxyModel 时,您可能会遇到这样的...

weixin_34125314的博客 180

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: Qt学习之路(43): QDirModel
下一篇: Qt学习之路(45): 自定义model之一
flowingFire2012
博客等级 码龄14年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值