文档章节

分享个做项目遇到的:QSortFilterProxyModel实现QTreeView的过滤的缺...

吥楛糖
 吥楛糖
发布于 2012/08/14 16:16
字数 589
阅读 241
收藏 1

    一般如果需要对一个视图进行关键字过滤,我们会使用QT的类QSortFilterProxyModel,将视图(view)的模型设置为这个代理类,将代理类的源模型定义为原始模型,然后定义代理模型的filterKeyColumn, filterRole, filterFixString或filterRegExp等属性后就可以实现过滤功能。如:

MyTreeModel model;  
QSortFilterProxyModel sfmodel;  
MyView view;  
  
view.setModel(&sfmodel);  
sfmodel.setSourceModel(&model);  
sfmodel.setFilterKeyColumn(0);  // optional  
sfmodel.setFilterRole(Qt::DisplayRole); // default, optional  
sfmodel.setFilterFixedString("keyword");  
sfmodel.setFilterRegExp("[hH]ello");

    但是对于TreeView和TreeModel,这样的做法有些缺陷,如果在子节点上的数据根据过滤规则可以显示,但它的parent节点根据过滤规则是不显示的。这样一来会因为父节点被过滤掉,而导致符合条件的子节点也一起被过滤掉了。如果需要对这个缺陷进行改进,可以这样来做:QSortFilterProxyModel继承一个自己的代理类,重新实现它的filterAcceptsRow函数,当节点不是一个叶子节点(在末端,没有子节点)时不应用过滤规则,只对叶子节点应用过滤规则,这样就可以达到上述要求。代码如下:

bool MyFilterProxyModel::filterAcceptsRow ( int source_row,  
                            const QModelIndex & source_parent ) const  
{  
    QModelIndex source_index = sourceModel()->index(source_row, 0, source_parent);  
    if (sourceModel()->rowCount(source_index)>0)  
        return true;  
    else  
        return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);  
}

    上面的代码会带来一个新的缺陷,就是对于非叶子节点不应用过滤规则,对于那些没有子节点符合过滤规则,且自身节点也不符合过滤规则的节点,也会一直在视图中显示。如果需要弥补这个问题,可以继续做以下的改进:在应用过滤规则时,如果自身不符合过滤规则,再去检查所有的子节点(递归调用至所有的后代节点),若所有的子节点都不符合过滤规则,那么这个子节点就不显示,只要有一个后代节点符合规则,就需要显示这个节点。代码如下:

bool MyFilterProxyModel::filterAcceptsRow ( int source_row,  
                            const QModelIndex & source_parent ) const  
{  
    bool filter = QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);  
  
    if (filter)  
    {  
        return true;  
    }  
    else  
    {  
        // check all decendant's  
        QModelIndex source_index = sourceModel()->index(source_row, 0, source_parent);  
        for (int k=0; k<sourceModel()->rowCount(source_index); k++)  
        {  
            if (filterAcceptsRow(k, source_index))  
            {  
                return true;  
            }  
        }  
    }  
  
    return false;  
}

按照这样的做法,就可以达到一个比较理想的过滤效果。

本文转载自:http://blog.csdn.net/lutx/article/details/7161467

吥楛糖

吥楛糖

粉丝 27
博文 4
码字总数 0
作品 0
深圳
程序员
私信 提问
QSortFilterProxyModel

QSortFilterProxyModel类提供在其他的model和view之间排序和过滤数据的支持 QSortFilterProxyModel可以用来对item进行排序,筛选,它把一个model的source结构通过model的index结构map到他新提...

晨曦之光
2012/04/13
1K
0
QDirModel使用QSortFilterProxyModel过滤指定磁盘和非系统盘

由于项目中需要,需要过滤掉指定某个磁盘,并且要对显示出来的非本地系统盘符过滤掉,只保留CDEF等盘符。网上没有可供参考的资料,折腾了很久,终于搞定了,现在写下来以供后人借鉴。 一、过...

kartik
2014/12/02
0
0
QListView,QTreeView和 QStandardItemModel的简单使用 (转...

include "testqstandarditemmodel.h" #include <QtGui/QApplication> //int main(int argc, char *argv[]) //{ // QApplication a(argc, argv); // testQStandardItemModel w; // w.show(); ......

王敬哲
2013/08/26
11.7K
0
PyQt5系列教程(30): 文本输入栏(QLineEdit)4

这期我们继续介绍一下文本输入栏(QLineEdit),我们已经介绍了其常用属性、信号、函数还有自定义密码输入框,今天是最后一章,文本框自动补全。 若我们想用到QLineEdit自动补全的功能,必须...

学点编程吧
2018/03/02
0
0
如何让QTreeView选中行的颜色拓展到整个width?

现在在用QTreeView写一个播放列表,遇到了这样一个问题: 我设置了整行选中以后发现QTreeView并不能选中每一行后面的空白的地方: 读了一下QTreeView的源代码,发现它只绘制了当前所有visib...

東條・スペンサー・咲
2014/07/12
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
9
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部