博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
跟我一起学QT12:基础排序/过滤模型之QSortFilterProxyModel的使用
阅读量:6226 次
发布时间:2019-06-21

本文共 2586 字,大约阅读时间需要 8 分钟。

  hot3.png

0. 源代码下载

1. 程序效果图

    当我们选择:大小写不敏感,以列Subject作为筛选对象,以常规的正则表达式作为过滤条件情况下,输出为:

2. 源代码解析

1. 界面排布

    分为original Model和Sorted/Filterd Model两部分。Sorted/Filterd Model的布局如下:

QGridLayout *proxyLayout = new QGridLayout;    //addWidget后四个参数表示:proxyView的位置是0行0列,其中行占用1行,列占用3列    proxyLayout->addWidget(proxyView, 0, 0, 1, 3);    proxyLayout->addWidget(filterPatternLabel, 1, 0);    proxyLayout->addWidget(filterPatternLineEdit, 1, 1, 1, 2);    proxyLayout->addWidget(filterSyntaxLabel, 2, 0);    proxyLayout->addWidget(filterSyntaxComboBox, 2, 1, 1, 2);    proxyLayout->addWidget(filterColumnLabel, 3, 0);    proxyLayout->addWidget(filterColumnComboBox, 3, 1, 1, 2);    proxyLayout->addWidget(filterCaseSensitivityCheckBox, 4, 0, 1, 2);    proxyLayout->addWidget(sortCaseSensitivityCheckBox, 4, 2);    proxyGroupBox->setLayout(proxyLayout);
    这里使用QGridLayout来布局。而通过addWidget来进行排布:

void QGridLayout::addWidget(QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0)
    在QGrid中布局widget,从fromRow行fromColumn列开始,而fromRow横跨rowSpan行,fromColumn横跨columnSpan列。

而original Model则相对简单:

model->insertRow(0);    //这里是在model的第0行0,1,2列插入数据--则会将数据插入到sourceGroupBox中去    model->setData(model->index(0, 0), subject);    model->setData(model->index(0, 1), sender);    model->setData(model->index(0, 2), date);
    这里将数据直接写到 original Model中去。通过:

mainLayout->addWidget(sourceGroupBox);    mainLayout->addWidget(proxyGroupBox);    setLayout(mainLayout);
    来完成最终的排序。

2. 关键代码解析

1. 当用于排序或者过滤的列名改变的时候,需要改变排序的属性(比如以Subject来排序,而后来修改为以Sender来排序)

void Window::filterColumnChanged(){    proxyModel->setFilterKeyColumn(filterColumnComboBox->currentIndex());}
    其中setFilterKeyColumn将其参数的列名作为排序/过滤的标准。

2. 对于大小写是否敏感的判断

void Window::sortChanged(){    proxyModel->setSortCaseSensitivity(                sortCaseSensitivityCheckBox->isChecked() ? Qt::CaseSensitive                                                         : Qt::CaseInsensitive);}
3. 正则表达式排序的关键代码

void Window::filterRegExpChanged(){    //使用正则表达式中的Regular expression,Wildcard还是Fixed string三种过滤标准    QRegExp::PatternSyntax syntax =            QRegExp::PatternSyntax(filterSyntaxComboBox->itemData(                                       filterSyntaxComboBox->currentIndex()).toInt());    //是否大小写敏感    Qt::CaseSensitivity caseSensitivity =            filterCaseSensitivityCheckBox->isChecked() ? Qt::CaseSensitive                                                       : Qt::CaseInsensitive;    QRegExp regExp(filterPatternLineEdit->text(), caseSensitivity, syntax);    proxyModel->setFilterRegExp(regExp);}

转载于:https://my.oschina.net/voler/blog/347767

你可能感兴趣的文章
rsync+shell脚本完成自动化备份
查看>>
Android中moveTo、lineTo、quadTo、cubicTo、arcTo详解(实例)
查看>>
Excel 2010同时打开多个独立的窗口
查看>>
Watchguard-X505e-mobile***配置终结篇
查看>>
我的友情链接
查看>>
centos6.5安装mysql5.6.23报错
查看>>
sz/rz工具包,linux下没有sz和rz命令
查看>>
tomcat项目进入不了debug模式
查看>>
我抽中了管理员bobo的祝福
查看>>
8款非常棒的响应式 jQuery 幻灯片插件推荐
查看>>
Web前端开发人员和设计师必读文章【系列十一】
查看>>
saltstack 数据系统——Grains
查看>>
springmvc 集成和使用 hibernate-validator
查看>>
Apache和Tomcat利用Proxy代理保持Session
查看>>
LVM(Logical Volume Manager)逻辑卷管理 - 简介、历史、术语、安装、命令、实例、故障排除...
查看>>
多选按钮(CheckBox)——Mars Android开发视频教程之第一季第九集(重)
查看>>
订单号消费码生成(线性同余算法)
查看>>
《SQLSERVER2012之T-SQL教程》T-SQL子查询
查看>>
[deviceone开发]-优惠券商户管理端App开源
查看>>
360搜索“搏杀”成功,赢在创新
查看>>