如何在一个QTreeView

时间:2016-07-14 15:00:21

标签: c++ qt qtreeview qstandarditemmodel

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

1 个答案:

答案 0 :(得分:1)

我认为,您可以尝试为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