如何在Qt中创建多级QVariantMap?

时间:2017-05-16 15:01:42

标签: javascript c++ qt qtwebkit

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

所以我的目标是填写并访问如下地图:

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框架。

1 个答案:

答案 0 :(得分:0)

我设法通过使用指向我的对象的数据指针来解决我的问题。 这非常有用。

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;