找回密码
 立即注册
收起左侧

QTreeView使用QSortFilterProxyModel进行过滤的问题

2
回复
3916
查看
[复制链接]
累计签到:793 天
连续签到:5 天
来源: 2017-9-27 18:42:16 显示全部楼层 |阅读模式
10Qter豆
下图是我想要的效果,具体效果如下(其实就是Visual Studio解决方案上方搜索框的效果)
1.如果子节点无匹配项 父节点也不匹配,则父子节点都不显示
2.如果任一子节点匹配,父节点不匹配,父节点也要显示
3.如果只有父节点匹配,所有子节点不匹配,则只显示父节点



我现在的效果是父节点一直在显示,其它正常,如何实现上述效果呢

网上看到一篇帖子说可以这样做,但是当逐字符清空搜索框里的搜索条件时,无法正常显示
  1. // \reimp
  2. bool MyFilterProxyModel::filterAcceptsRow ( int source_row,
  3.                             const QModelIndex & source_parent ) const
  4. {
  5.     bool filter = QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);

  6.     if (filter)
  7.     {
  8.         return true;
  9.     }
  10.     else
  11.     {
  12.         // check all decendant's
  13.         QModelIndex source_index = sourceModel()->index(source_row, 0, source_parent);
  14.         for (int k=0; k<sourceModel()->rowCount(source_index); k++)
  15.         {
  16.             if (filterAcceptsRow(k, source_index))
  17.             {
  18.                 return true;
  19.             }
  20.         }
  21.     }

  22.     return false;
  23. }
复制代码

希望做过的给点建议

附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册
回复

使用道具 举报

尚未签到

2018-1-18 15:20:04 显示全部楼层
我也是像你上面引用的那样做的,只不过在响应输入字符串动作的槽里要先展开所有的node,代码:ui.treeView->expandAll(),
然后再用QSortFilterProxyModel过滤,这样只有目标叶子节点及其父节点们显示,如果过滤字符串为空,所有节点都会被展开。
不知道你说的是不是这个意思


点评

我现在也是都展开 总感觉不太好。。。。。。  详情 回复 发表于 2018-2-6 12:51
回复

使用道具 举报

累计签到:793 天
连续签到:5 天
2018-2-6 12:51:02 显示全部楼层
昔年往矣 发表于 2018-1-18 15:20
我也是像你上面引用的那样做的,只不过在响应输入字符串动作的槽里要先展开所有的node,代码:ui.treeView- ...

我现在也是都展开 总感觉不太好。。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册