问题标签 [qsortfilterproxymodel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
8772 浏览

qt - 将 QSortFilterProxyModel 与树模型一起使用

我有一个QDirModel其当前目录已设置。然后我有一个QListView应该显示该目录中的文件。这工作正常。

现在我想限制显示的文件,所以它只显示png文件(文件名以 .png 结尾)。问题是使用 aQSortFilterProxyModel并设置过滤器正则表达式也会尝试匹配文件的每个父级。根据文档:

对于分层模型,过滤器递归地应用于所有子级。如果父项与过滤器不匹配,则不会显示其子项。

那么,我如何QSortFilterProxyModel才能只过滤目录中的文件,而不是它所在的目录?

0 投票
1 回答
1633 浏览

qt - 在 Qt 中如何对 QModelIndex 的直接子索引进行排序

我正在编写一个 C++ 应用程序,它使用 Qt 类来处理某些数据模型。为此,我继承自QAbstractItemModel

在某些时候,我的应用程序中需要一个排序/过滤选项,所以我还创建了一个继承自的类QSortFilterProxyModel

为了实现排序,我使用了默认QSortFilterProxyModel::sort()方法(我没有在我的代理模型类中重新实现它)并且有一段时间它似乎可以工作。

但在某些时候,我注意到实际QSortFilterProxyModel::sort()方法对整个模型进行排序,而我需要的是仅对某个索引的直接子项进行排序。

我试图重新实现类的sort()方法EventModel,但过了一会儿我意识到这QSortFilterProxyModel::sort()根本不是指它。另一方面,我不确定如何以安全的方式重新排列索引,以便显示模型的视图不会崩溃。

我认为一定有一种方法可以只对某个的直接孩子进行排序QModelIndex,但我还没有找到。

是否有任何教程/示例可以演示我的案例的可能解决方案,或有关如何做到这一点的一些指导方针?

问候

0 投票
1 回答
2212 浏览

sqlite - PyQT QAbstractProxyModel mapToSource

我已经将我的 QTableView 设置为视图,该视图的模型是 QSqlQueryModel。

在此处输入图像描述

对不起,塞尔维亚的信件,不过你会明白我在说什么。

屏幕截图 2,在 searchName 函数之后。再次,请原谅我的塞尔维亚字母。现在的问题;

如果我单击第一个屏幕截图中的一行,我会在控制台中打印行号和列号,例如 8,2。如果我单击第二个屏幕截图中的一行(打开代理过滤器的行),我会得到第 -1 行,第 -1 列。

我将如何实现 QAbstractProxyModel 和 mapToSource 方法来获取真实的行号和列号?

:编辑:

我得到的输出:

第 9 行第 1 列名称 JOHN DOE

0 投票
1 回答
2193 浏览

qt - appendRow 后带有 QStandardItemModel 的 QSortFilterProxyModel 不起作用

这是我得到的:

  • 一个QTreeView小部件(*);
  • 源模型MainModel继承自QStandardItemModel. 没有重新实现虚data() const方法;
  • 代理MainFilterProxyModel继承自QSortFilterProxyModel

那个树:

所以主要问题是当我试图添加一个像 (**) 代码那样的CHILD-row时。过滤器代理模型,在文档被添加到源模型后,不知道新行,也没有在树上显示。

我确定代理在方法完成工作QStandardItemModel时没有收到信号appendRow,因此代理无法过滤新行,也没有使其可见。

有什么帮助吗?

谢谢。

PS:如果我关闭代理,一切都很好。但问题不在于代理。代理只是没有得到关于附加到主源模型的新行的信号......


(*)这里是QTreeView


(**)这是我的附加功能

0 投票
3 回答
2820 浏览

qt - QSortFilterProxyModel 并按整数、布尔值过滤

我有一个QSortFilterProxyModel连接到一个QSqlQueryModel. 在基础查询中有布尔和整数字段。我想按这些布尔值、整数等值进行过滤。令人惊讶的是(或者我错了)QSortFilterProxyModel仅按字符串过滤。例如,如果您想过滤 ID(通常是整数),这就是一个“问题”。例如,如果您尝试过滤ID=22,您将获得所有内部带有“22”的 ID(122、222、322 等)。请参阅此链接以获取非非常优雅的解决方案。

但是您将如何按布尔字段过滤?有人可以给点提示吗?我想我必须子类化QSortFilterProxyModel,还是有另一种方法?

0 投票
0 回答
1007 浏览

expand - Qt:ProxyModel、QTreeView 和带过滤的委托设置无法正确更新

我有一个 QTreeView 设置显示 QSortFilteredProxyModel 在 filterAcceptsRow() 中自定义过滤,只接受取决于父行值的值的行(通过 QStyledItemDelegate 派生类在 QComboBox 中选择。例如,如果我在一行中选择“类型” 值“宝马”,我想为这个特殊情况显示孩子。这对第一个项目很有用,我可以在 Item1 中选择这些值多个级别(最多 5 个级别)。一切都很好。

但是,我注意到,一旦我使用 item1 和此自定义过滤,然后添加 item2,问题就开始了。我注意到的第一件事是,QTreeView 确实取消了 item1/item2 的公共父项,并且只显示了根项的子项。正常行为(以及添加 item1 的行为确实如此)是扩展 item1 的父项。为什么这会对第二个项目感到困惑,并且只有当我一直在玩 item1 的儿童设置 idk 时。此外,我注意到在 item2 中过滤无法正常工作。我在 item2->Type 中有一个 QComboBox,其子项取决于 item2->Type 值。. QComboBox 的默认值的第一个子项仍会按应有的方式显示,但是在更改 QComboBox 时,视图不再更新,并且留在 item2/item3/... 中的第一个加载的子项 但是,使用正确的值/索引调用 Delegate::setModelData 并相应地调用 TreeItem->setData() 。只是过滤似乎卡在了 TreeItem->data() 的旧值上。请再次注意,这只发生在我玩过 item1 之后。如果我不碰那个项目,我可以正确玩所有其他项目(item2,item3,...)并且它做得很好。

如果有人可以提供帮助,我将非常高兴。

有没有人给我提示,什么可能导致扩展状态的“重置”,即使 expand() 被称为 item1 和 item2 插入并且对 item1 很好用?什么可能导致我的进一步问题?

ExampleDelegate.h

代理模型.h

代理模型.cpp

0 投票
0 回答
901 浏览

pyqt4 - 如何使用 QSortFilterProxyModel 在 QTableView 中显示富文本?

介绍:

我有一个有 5 列的表和一个 QLineEdit,它的作用类似于第二列的过滤器。另外,我计划实现一个按钮来隐藏/显示与第一列中的文本匹配的行,另一个按钮来突出显示第二列中的文本。

五列是:

  1. 只是图标,每个图标对应一个名称。
  2. 必须表现得像链接的超链接文本(就像 QLabel 中的 HTML 锚)。
  3. 文件大小以:KB、MB、GB、TB 等表示。必须是超链接,如第二列。
  4. 整数
  5. 整数

所有列都必须是可排序的。

在实现 QSortFilterProxyModel 之前,我几乎可以解决所有问题。
这就是我所拥有的:

ResultsStandardItem.py(用于自定义排序的 QStandardItem 的子类):

主要代码:

一切都很好。第一列仅显示图标并且是可排序的,第二列和第三列显示富文本,并且自定义排序按预期工作。唯一应该解决的问题是 QLabel 没有 Qt.TextElideMode,因此,当文本不适合列时,它就会被剪切。

问题:

当我启用 QSortFilterProxyModel 时,QLabels 消失了。所以我必须以正常方式显示文本,并且自定义排序停止工作。
我被困在这里,不知道去哪里。此外,我必须实现突出显示,我不知道如何。所以我需要解决第一个问题,记住下一步是实现突出显示。

我是 Python 和 Qt 的新手,需要有人向我解释正确的方法。最近几天我一直在做这个。我不想选择第一个替代方案然后返回,因为这种方法不允许我实现我需要的其他东西。

提前致谢。

编辑:
我能够使用自定义搜索设置“setSortRole(Qt.UserRole)”。对于每个项目,我将数据设置为将用于排序的相应值。另外,我将“ResultsStandardItem”更改为设置数据而不是 sortKey。

结果标准项目.py:

主要的:

所以,富文本是唯一缺少的东西。

0 投票
0 回答
649 浏览

c++ - 如何使用 QSortFilterProxyModel 在 QTreeView 中对系统驱动器进行排序

我有一个QTreeview,我在其中使用QFileSystemModel显示所有系统驱动器。我正在寻找更好的方法,其中QTreeview可以在一个部分显示本地驱动器,在另一个部分显示可移动驱动器,依此类推。基本上对驱动器进行分类。

这是代码:

这基本上为我提供了所有驱动器,如下所示:

使用hideColumn()我隐藏了使用 QTreeView 时显示的所有标题(名称除外),即名称、类型、大小等。

我的要求:

  1. 我基本上想要实现的是:

    • 本地文件夹
      • C:
      • 新卷(D:)
      • 新卷(E:)
    • 可移动驱动器
      • SD_卡(F:)
      • 超越驱动(G:)

基本上将本地驱动器和外部驱动器分开。我遇到了QSortFilterProxyModel,它看起来像是对驱动器顺序进行排序。但我不知道如何使用它。

  1. 我想删除 QTreeView 中的标题。由于名称在我的输出中可见,我想隐藏它。如果你能指导我会很有帮助:)
0 投票
1 回答
3773 浏览

pyqt4 - 如何在pyqt中仅列出QTableView中的可见项目

我有下面的代码来获取 QTableView 的过滤器。但我无法一次过滤多个列。

即,如果过滤列 2row 0 col 0并尝试过滤列 2,它应该只显示可见的唯一值column 2(可能它应该只显示)但现在它显示( , , )row 0 col 1的所有元素column 2row 0 col 1row 1 col 1row 2 col 1

当我运行上面的代码时,我得到以下输出

在此处输入图像描述

当我单击第 2 列标题时,显示的过滤器列表如下所示,并且正确显示(该列中的唯一值)...

在此处输入图像描述

当我row 0 col 1在显示的过滤器中选择时,我得到以下过滤列表

在此处输入图像描述

但是,当我再次单击第 2 列标题进行过滤时,它会显示与我的第一张图片相同的列表。第 2 列的所有唯一项(来自模型视图)而不是来自 proxyfilter。实际上它应该只显示row 0 col 1为第 2 列中的唯一项目row 0 col 1

在此处输入图像描述

0 投票
0 回答
647 浏览

qt - Qt + QSortFilterProxyModel + QStandardItemModel + QTreeView + 删除行时的粉碎

将 QTreeView 与 QStandardItemModel 和 QSortFilterProxyModel 一起使用时出现问题。当我尝试从源模型中删除行时,我的程序崩溃了。在这个地方

洞项目(tar.gz)

帕斯宾网

堆栈看起来像这样

我正在使用带有 Qt 4.8.3 的 kubuntu 12.10。

我的代码有错误还是Qt的错误?

谢谢。


我尝试使用 4.8.4 构建项目并且它有效。所以我认为,这是 Qt 的错误