QTreeView - 排序和过滤模型

Posted

技术标签:

【中文标题】QTreeView - 排序和过滤模型【英文标题】:QTreeView - Sort and Filter a model 【发布时间】:2009-06-30 08:42:21 【问题描述】:

我正在尝试创建一个显示一些排序信息的 QTreeView。为此,我在视图和模型之间使用了 QSortFilterProxyModel。

问题是我想将行数限制为前 n 行(排序后)。模型中的过滤器函数接收原始的 sourceRow,所以我不能使用它。

我尝试链接两个 QSortFilterProxyModel:第一个用于排序,第二个用于过滤。但似乎第二个代理模型(过滤)没有收到排序的行......

还有其他方法吗? 有没有人使用这种技术(链接 2 个代理模型)并且有效?

谢谢

编辑: 我已经尝试使用 rowCount 并且它不起作用。 我也尝试链接 2 个代理模型,但问题是视图调用它接收的模型的排序函数。因此,如果第一个代理排序和第二个过滤器排序将在过滤器模型上调用并且数据不会被排序。

EDIT2:我查看了 qt 源代码,过滤是在排序之前完成的,所以在 filterAcceptsRow() 中我不知道任何排序顺序。

【问题讨论】:

你有没有试过在qtcentre.org上提问? 【参考方案1】:

只是出于好奇,您是否尝试过覆盖 rowCount 方法并仅返回 25(或任何 n 在您的情况下)?它可能就这么简单......好吧,如果你总是至少有 n 个项目。

否则,您可以尝试链接模型。我不知道为什么它不起作用,但我自己从未尝试过类似的东西。

【讨论】:

【参考方案2】:

在尝试了一些过于复杂的方法来解决这个问题后,我为我的问题做了一个小技巧:插入/删除一行后,我调用 setRowHidden 来隐藏前 n 行。 这不是最优雅的解决方案,并且特别适合我的需求,但我无法找到更好的替代方案。

我喜欢在 gtk 上提到这一点,因为过滤器和排序代理模型是分开的,这可以很容易地完成。

我仍然希望有人可以为此提供更好的解决方案。

【讨论】:

以上是关于QTreeView - 排序和过滤模型的主要内容,如果未能解决你的问题,请参考以下文章

QTreeView 的两个嵌套代理模型和段错误

PySide QTreeView 倒序

防止 QTreeView 项目在过滤后自动折叠

QTreeView 和 QTableView 的 Qt 模型

在pyqt QTreeView中选择行和列

QTreeView - 如何判断拖放事件是重新排序还是父母之间的移动?