将 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
我正在尝试通过 main.cpp 中的 qmlRegisterType
将 typedef QMultiMap<QString, QString> 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<QString, QVariant>
。
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的主要内容,如果未能解决你的问题,请参考以下文章