首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QMap中将QList中的元类型注册为元类型?

问如何在QMap中将QList中的元类型注册为元类型?
EN

Stack Overflow用户
提问于 2018-03-27 16:48:52
回答 1查看 1.1K关注 0票数 0

我正在研究如何将一个QList<QMap<QString, QString>>对象从我的Qt代码传递到一个JavaScript文件,并想知道如何正确处理代码的qScriptRegisterMetaType部分。

目前,我正在考虑让我的脚本值转换方法使用QList注册方法和QMap注册方法的一部分。

我所引用的代码可以找到为QList而来和为QMap而来。

具体来说,在将QList<QMap<QString, QString>>转换为QScriptValue时,我希望使用这个片段来处理QMap部分:

代码语言:javascript
复制
QScriptValue obj = engine->newObject();
StringMap::const_iterator it(map.begin());
for (; it != map.end(); ++it)
{
    obj.setProperty(it.key(), qScriptValueFromValue(engine,it.value()));
}
return obj;

使用它,我想运行QMap转换,同时为QList设置每个属性,并返回结果的QScriptValue。

代码语言:javascript
复制
QScriptValue ScriptListtoScriptValue(QScriptEngine* engine, const ListMap& list)
{
    QScriptValue obj = engine->newArray(list.size());
    for ( int i = 0; i < list.size(); i++ ) {
        obj.setProperty(i, engine->newQObject(list[i]));
    }

    return obj;
}

我是否可以调用一个函数,该函数在QMap转换中运行QList转换并以这种方式设置属性?我想知道我是不是遗漏了什么,或者Qt会不会对此感到满意,并且没有将数据正确地传递给JavaScript。

至于我为什么要这样做的原因:我希望向JavaScript发送一个结构,这样QMap将作为一个单独的记录保存多个列名和值的键/值配对。然后,QList将是这些记录的列表。如果我的方法有缺陷,并且有更好的方法将这类信息从Qt发送到JavaScript,我将非常感谢建设性的批评。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-28 13:30:46

我想出了一个解决方案,适用于任何想要在未来尝试的人。我用我建议的方式把这两种方法结合起来。

在头文件中,我创建了一个ScriptList类,它是一个QList< QMap<QString, QString> >,必须包括尖括号之间的空格,否则它将被解释为>>。此外,我还创建了一个处理QMap<QString, QString>的QMap<QString, QString>类。

代码语言:javascript
复制
class StringMap : public QMap<QString, QString> {};

class ScriptList : public QList< QMap<QString, QString> > {};
QScriptValue ScriptListToScriptValue(QScriptEngine* engine, const ScriptList& list);
void ScriptListFromScriptValue(const QScriptValue &obj, ScriptList& list);
QScriptValue MapToScriptValue(QScriptEngine* engine, const QMap<QString, QString>& map);
void MapFromScriptValue(const QScriptValue &obj, QMap<QString, QString>& map);

然后,我做了所有必要的声明和登记:

代码语言:javascript
复制
Q_DECLARE_METATYPE(ScriptList)
Q_DECLARE_METATYPE(StringMap)

qRegisterMetaType<ScriptList>("QList< QMap<QString,QString> >");

qScriptRegisterMetaType(m_engine, ScriptListToScriptValue, ScriptListFromScriptValue);

这些行彼此位于代码的不同部分。

然后是在QMap中生成QList所需的函数。

代码语言:javascript
复制
QScriptValue ScriptListToScriptValue(QScriptEngine* engine, const ScriptList& list)
{
    QScriptValue obj = engine->newArray(list.size());
    for ( int i = 0; i < list.size(); i++ ) {
        obj.setProperty(i, MapToScriptValue(engine, list[i]));
    }

    return obj;
}

void ScriptListFromScriptValue(const QScriptValue &obj, ScriptList& list)
{
    list.clear();
    QScriptValueIterator itr(obj);
    while ( itr.hasNext() ) {
        itr.next();
        if ( itr.flags() & QScriptValue::SkipInEnumeration)
            continue;
        QMap<QString, QString> map;
        MapFromScriptValue(itr.value(), map);
        list.append(map);
    }

}

QScriptValue MapToScriptValue(QScriptEngine *engine, const QMap<QString, QString>& map)
{
    QScriptValue obj = engine->newObject();
    StringMap::const_iterator it(map.begin());
    for (; it != map.end(); ++it)
    {
        obj.setProperty(it.key(), qScriptValueFromValue(engine,it.value()));
    }
    return obj;
}


void MapFromScriptValue(const QScriptValue &obj, QMap<QString, QString>& map)
{
    QScriptValueIterator itr(obj);
    while(itr.hasNext())
    {
        itr.next();
        map.operator [](itr.name().toUtf8()) = qscriptvalue_cast<ScriptMap::mapped_type>(itr.value());
    }
}

希望这能对处于类似情况的人有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49518406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档