博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分享个做项目遇到的:QSortFilterProxyModel实现QTreeView的过滤的缺...
阅读量:6864 次
发布时间:2019-06-26

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

  hot3.png

    一般如果需要对一个视图进行关键字过滤,我们会使用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
rowCount(source_index); k++) { if (filterAcceptsRow(k, source_index)) { return true; } } } return false; }

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

转载于:https://my.oschina.net/ddj/blog/72769

你可能感兴趣的文章
实战:将静态路由发布到动态路由
查看>>
Linux桌面新彩虹-Fedora 14 炫酷应用新体验
查看>>
灵活管理Hadoop各发行版的运维利器 - vSphere Big Data Extensions
查看>>
Data Protection Manager 2010 系列之安装部署
查看>>
【SeaJS】【3】seajs.data相关的源码阅读
查看>>
[PHP] 访问MySQL
查看>>
linux下redmine3.3迁移、升级、插件备忘录
查看>>
Hadoop原理及部署初探
查看>>
Oracle 11g R2 常见问题处理
查看>>
windows下expdp自动备份脚本
查看>>
WPF-009:WPF窗体的拖动
查看>>
MDT2012部署系列之10 Win7镜像捕获与系统安装
查看>>
Windows 2003 AD升级至Windows 2012 AD之DHCP服务器迁移
查看>>
MapReduce原理与设计思想
查看>>
Docker 镜像小结---操作指令介绍(七)
查看>>
实现机选双色球
查看>>
Powershell RESTAPI 访问Office365
查看>>
企业级数据中心之存储虚拟化
查看>>
spring源码之—Assert.notNull
查看>>
vue 不能监测数组长度变化length的原因
查看>>