我有两个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?在这种情况下,如何在每个模型中保存所有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.
答案 0 :(得分:1)
我认为,您可以尝试为QTreeViews
同时使用两个QFileSystemModels,并且每次点击第一个QStandardItemModel
中的项目时都不要创建QTreeView
。正如您在文档中看到的那样,QFileSystemModel
具有setRootPath方法。每次单击第一个QTreeView
中的文件夹时,您都可以将此方法用于第二个模型。
要使您的商品可以检查,请浏览这些有用的文章:
http://www.qtcentre.org/threads/27253-QFileSystemModel-with-checkboxes