我有两个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/