繁体   English   中英

如何在QtScript中将QMap内部的QMap注册为元类型?

[英]How to register a QMap inside of a QList as a Meta Type in QtScript?

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

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

我要引用的代码可以在这里找到QListQMap

具体来说,当将QList<QMap<QString, QString>>转换为QScriptValue时,我想使用此代码段来处理QMap部分:

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;

使用它,然后我想在设置QList的每个属性的同时运行QMap转换并返回生成的QScriptValue。

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;
}

我可以调用一个在QList转换内部运行QMap转换并以此方式设置属性的函数吗? 我想知道我是否丢失了某些东西,或者Qt对此不满意并且没有将数据正确地传递给JavaScript。

至于执行此操作的原因:我希望将结构发送给JavaScript,以使QMap可以将多个列名称和值的键/值对作为单独的记录保存。 然后,QList将是这些记录的列表。 如果我在方法上存在缺陷,并且有更好的方法将此类信息从Qt发送到JavaScript,我将不胜感激建设性的批评。

我能够提出一种解决方案,该解决方案适用于将来希望尝试此操作的任何人。 我按照建议的方式结合了这两种方法。

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

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);

然后,我做了所有必要的声明并注册:

Q_DECLARE_METATYPE(ScriptList)
Q_DECLARE_METATYPE(StringMap)

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

qScriptRegisterMetaType(m_engine, ScriptListToScriptValue, ScriptListFromScriptValue);

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

然后介绍在QList中制作QMap所需的功能

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());
    }
}

希望这会对类似情况的人有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM