【问题标题】:Change data representation structure in QSortFilterProxyModel更改 QSortFilterProxyModel 中的数据表示结构
【发布时间】:2017-10-26 22:55:07
【问题描述】:

我有自定义的 QSortFilterProxyModel 类,我正在使用 QFileSystemModel 并在 QTreeView 中显示它。我需要执行以下操作:如果存在具有相同名称(忽略文件扩展名)的文件夹和文件,则必须将文件夹中的文件停靠到此文件。例如,我有 Creatures.txt 文件和包含两个 txt 文件的 Creatures 文件夹。我想从最终视图中隐藏它并显示,如第二张图片所示。

据我了解,QSortFilterProxyModel 仅用于过滤和排序,而不用于更改数据结构。我还需要在视口中创建/拖放文件。

【问题讨论】:

    标签: c++ qt qsortfilterproxymodel


    【解决方案1】:

    这样做相当棘手,因为没有标志来切换模型中项目的可见性。

    相反,您可以创建自己的代理模型来省略这些项目。 (这意味着要适当地重新实现 rowCount()、data()、flags() 等。)

    但如果可以更改视图侧的可见性,作为一种解决方法,您可能更容易使用 QTreeView::setRowHidden() 代替。

    编辑:也许重写 QSortFilterProxyModel::filterAcceptsRow() 更容易。

    【讨论】:

    • 我已经创建了用于过滤项目的代理模型。问题在于模型结构的改变。
    • @Kamanji 您必须返回具有不同父级、行和列的 QModelIndex。如果你发布代理代码会很有帮助。
    • @eyllanesc Here 是我对 filterAcceptRow 函数的重新实现。我现在唯一的问题是更改项目的父项。如果我可以使用代理模型做到这一点,然后能够从原始模型中检索索引,这就是我所需要的。我还想过构建自定义 itemModel,然后在其中进行所有重组
    • @Kamanji 既然要换父母,可以举个例子
    • @eyllanesc 什么样的例子?我在 QFileSystemModel 上使用代理模型并处理文件。我在我的问题中举了例子,如果有什么不清楚的地方我可以解释一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2011-04-24
    相关资源
    最近更新 更多