【问题标题】:How can I organize QStandardItemModel`s in one QTreeView如何在一个 QTreeView 中组织 QStandardItemModel
【发布时间】:2016-07-15 16:28:26
【问题描述】:

我有两个 QTreeView。

第一个 (QTreeView1) 显示的文件夹,第二个 (QTreeView2) - 显示的子文件夹,在第一个 QTreeView1 中单击文件夹时加载。 在 QTreeView1 中按文件夹单击时,我使用子文件夹创建 QStandardItemModel 并将此模型设置为 QTreeView2。此外,两个 QTreeView 中的所有项目都是可检查的,我想保存所有已检查项目的状态。 如何为每个加载的文件夹组织模型存储。 是不是应该是这样的:

// store folder model on subfolders check state changed
QMap<QStandardItemModel*, QString> modelStorage;
modelStorage.push_back(folderModel, folderPath);

并在文件夹点击恢复文件夹:

QStandardItemModel* findFolderModel(QString folderPath)
{
    QStandardItemModel* model;
    foreach(auto path, modelStorage)
    {
        if (path == folderPath)
        {
            model = modelStorage.find(folderPath);
        }
        else model = nullptr;
    }

   return model;
}

然后显示模型... 存储所有文件夹模型是否正确?还是必须动态加载?但在那种情况下,我需要自己存储所有模型数据(例如,检查项目状态......)。此外,模型的数据可以更改一段时间,如果我从“快照”恢复模型,则无法显示“正确”的数据。

UPD 我也对我的建议的实施有疑问: 我通过 QTreeView1 中的文件夹单击存储/恢复模型,它似乎可以工作......但恢复的模型不包含/显示 QStandardItems。发生这种情况是因为 treeItem 在本地范围内分配了 new 运算符?在这种情况下,如何保存每个模型中的所有 QStandardItem?

model = new QStandardItemModel;
QStandardItem* treeItem = new QStandardItem("item");
model->appendRow(treeItem);
//..
modelStorage.insert(folderItem, model);
ui.treeView->setModel(model);
// after restore model pointer is valid, but hadn't contains any items.

【问题讨论】:

    标签: c++ qt qtreeview qstandarditemmodel


    【解决方案1】:

    我认为,您可以尝试为您的两个QTreeViews 使用两个QFileSystemModels,并且不要在每次单击第一个QTreeView 中的项目时创建QStandardItemModel。正如您在文档中看到的那样,QFileSystemModelsetRootPath 方法。每次单击第一个 QTreeView 中的文件夹时,您都可以将此方法用于第二个模型。

    要使您的项目可检查,请浏览这些有用的文章:

    http://www.qtcentre.org/threads/27253-QFileSystemModel-with-checkboxes

    QFilesystemmodel with Checkboxes

    http://doc.qt.io/qt-5/qidentityproxymodel.html

    【讨论】:

    • 谢谢建议,但我的错误是我没有解释文件夹和子文件夹不是文件系统结构......它来自特定数据库的文件夹,我需要创建 QStandardItemModel 并手动填充它。对此案有何决定?
    • 在这种情况下,我认为,您只能使用一个 QStandardItemModel。对于第一个 QTreeView 显示此模型的所有文件夹。对于第二个 QTreeView,使用重新实现 QSortFilterProxyModel(在 QStandardItemModel 下)按特定文件夹过滤源 QStandardItemModel,您从第一个 QTreeView 确定。
    • amm) 再次感谢,但 QTreeView1 中的结构不包含来自 QTreeView2 的子文件夹。它不同,因为来自 QTreeView1 的文件夹在需要时会延迟加载。这就是我不能将所有数据存储在一个模型中的原因(加载整个数据库的时间)。它激励我将文件夹模型上的模型与“键”和子文件夹模型与 QTreeView1 模型中的键项分开)您对此有何看法?
    • 在这种情况下,您的方法是合理的。但是,我认为,最好动态创建这个模型(据我了解,从数据库)。每次,当您更改第二个 QTreeView 的模型时(通过单击第一个 QTreeView),将数据更改保存在数据库中。没有“快照”,“快照”和数据库数据之间没有同步问题。
    • 会很好,但我对数据库只有只读访问权限-它使用“快照”的原因...您知道 UPD 第一篇文章中描述的问题的决定吗?如何在 modelStorage 中存储每个模型的所有相关 QStandardItems? (现在它在超出范围时被破坏了......我需要模型的深层副本?我怎么能意识到这一点?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多