我有两个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。发生这种情况是因为在本地范围内使用new运算符分配了treeItem吗?在这种情况下,如何保存每个模型中的所有QStandardItems?

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.

最佳答案

我认为,您可以尝试对两个QTreeViews使用两个QFileSystemModels,并且不要在每次单击第一个QStandardItemModel中的项目时都创建QTreeView。如您在文档中所见,QFileSystemModel具有setRootPath方法。每次单击第一个QTreeView中的文件夹时,都可以对第二个模型使用此方法。

为了使您的项目可检查,请浏览以下有用的文章:

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

QFilesystemmodel with Checkboxes

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

关于c++ - 如何在一个QTreeView中组织QStandardItemModel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38377657/

10-13 06:11