如何在Qt中创建多级QVariantMap

How to create a multiple level QVariantMap in Qt?

本文关键字:创建 多级 QVariantMap Qt      更新时间:2023-10-16

我正在尝试创建一个多级QVariantMap,以便作为Javascript对象从QtWebKit访问。

所以我的目标是填充和访问如下所示的地图:

QMap<QString, QMap<QString, QMap<QString, QMap<QString, QList<QString> > > > > map;

我需要有一个这样的 Json 对象:

{
 "2017-05-11": {
  "60031": {
   "ok": {
    "12345": ["/tmp/img01.png", "/tmp/img02.png"]
   }
  }
 }
}

因此,例如,我可以在Javascript访问中:

var filepath = obj[date][partType][status][part][0];

我尝试了很多方法,但没有成功。我接受不同方法的建议,但我只需要使用 Qt 框架。

我已经通过使用指向我的对象的数据指针设法解决了我的问题。它真的很有用。

QVariantMap map;
boost::filesystem::path path(folder.toStdString());
boost::filesystem::recursive_directory_iterator dir(path), end;
while(dir != end)
{
    //std::cout << dir->path().extension().string() << std::endl;
    if(dir->path().extension().string() == ".png")
    {
        //Filepath example: 2017-05-10/60031/ok/20170508_155510910_-1_0.png
        QString date(dir->path().parent_path().parent_path().parent_path().filename().string().c_str());
        QString partType(dir->path().parent_path().parent_path().filename().string().c_str());
        QString status(dir->path().parent_path().filename().string().c_str());
        QString filename(dir->path().filename().string().c_str());
        QString filenameStem(dir->path().filename().stem().string().c_str());
        QStringList tokens = filenameStem.split('_');
        QString filepath(dir->path().string().c_str());
        QString part(tokens[0] + QString("_") + tokens[1] + QString("_") + tokens[2]);
        if(map[date].isNull())
        {   
            map[date] = QVariantMap();
        }
        QVariantMap* dateMap = (QVariantMap*)(map[date].data());
        if((*dateMap)[partType].isNull())
        {   
            (*dateMap)[partType] = QVariantMap();
        }
        QVariantMap* partTypeMap = (QVariantMap*)((*dateMap)[partType].data());
        if((*partTypeMap)[status].isNull())
        {   
            (*partTypeMap)[status] = QVariantMap();
        }
        QVariantMap* statusMap = (QVariantMap*)((*partTypeMap)[status].data());
        if((*statusMap)[status].isNull())
        {   
            (*statusMap)[part] = QList<QVariant>();
        }
        QList<QVariant>* partFiles = (QList<QVariant>*)((*statusMap)[part].data());
        (*partFiles).append(filepath);
    }
    ++dir;
}
return map;