我正在尝试创建一个多级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框架。
答案 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;