将 QMultiMap<QString, QString> 导出到 QML

Posted

技术标签:

【中文标题】将 QMultiMap<QString, QString> 导出到 QML【英文标题】:exporting QMultiMap<QString, QString> to QML 【发布时间】:2015-10-30 09:38:59 【问题描述】:

我有关注QObject:

#ifndef UETYPES
#define UETYPES

#include <QHash>
#include <QByteArray>
#include <QMultiMap>
#include <QString>
#include <QObject>

#include "../database/ueuserrecord.h"
#include "../database/ueorderrecord.h"

class UeTypes : public QObject

    Q_OBJECT

public:
    typedef QHash<int, QByteArray> UeTypeRoles;

    /*
     * QString  first parameter     userId
     * QString  second parameter    placeId
     */
    typedef QMultiMap<QString, QString> UeTypeLoggedUsers;
;

#endif // UETYPES

我正在尝试通过 ma​​in.cpp 中的 qmlRegisterTypetypedef QMultiMap&lt;QString, QString&gt; UeTypeLoggedUsers 公开/导出到 QML:

#include <QtQml>
#include <QApplication>
#include <QQmlApplicationEngine>

#include "core/uetypes.h"

int main(int argc, char *argv[])

    QApplication app(argc, argv);
    QQmlApplicationEngine engine;

    qmlRegisterType<UeTypes::UeTypeLoggedUsers>("si.test",
                                                1,
                                                0,
                                                "UeTypeLoggedUsers");

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();

但是,当我尝试编译此代码时,出现以下错误:

错误:“staticMetaObject”不是“QMultiMap”的成员

为什么会出现此错误,如何消除它?

【问题讨论】:

您只能从 C++ 向 QML 公开从 QObject 派生的类型。 顺便说一句,试试 QVariantMap。您无需注册即可将其传递给 QML。 @folibis 嗯,但我需要QMultiMap,而不是QMap,因为可能有多个相同的键... 好的,但是你需要以某种方式包装到 QObject 后代 你能把它转换成带有键/值对的 QVariantList,而不是 QMultiMap 吗? 【参考方案1】:

您可以直接在QML 到Qt property system 中使用QVariantMap。它被声明为typedef QMap&lt;QString, QVariant&gt;

class UeTypes : public QObject

    Q_OBJECT
    Q_PROPERTY(QVariantMap map READ map WRITE setMap NOTIFY mapChanged)

public:
    QVariantMap map() const  return mMap; 
    void setMap(QVariantMap map) 
       if(mMap != map) 
           mMap = map;
           emit mapChanged();
       
    

signals:
    void mapChanged();

private:
    QVariantMap mMap;

;

您可以使用QMap::insertMulti 将多个相同的键插入到 QMap。相当于QMultiMap::insert。

【讨论】:

以上是关于将 QMultiMap<QString, QString> 导出到 QML的主要内容,如果未能解决你的问题,请参考以下文章

将 jstring 转换为 QString

QT中enum和QString的互相转换。

QMap::insertMulti 还是 QMultiMap?

QMultiMap 结构为键,结构为值,比较运算符

qobject_cast没有Q_OBJECT宏错误

是否可以在自己的模板类中使用 QMultiMap::ConstIterator?