0

我有 QVariantMap(不是 QObject,因为没有预定义属性名称)。我将 QVariantMap 注入到 QML 根上下文中,以使用属性值进行绑定。

问题是,当我更改 QVariantMap 或什至更改 QVariantMap 并为更新的对象调用 setContextProperty 时,或者当我更新 contextProperty 返回的(使用 fromValue)对象时,什么也没有发生。所以这看起来像是一次绑定。

那么,以可观察的方式将 Map 或 Map 注入 QML 上下文的正确方法是什么,以便地图中更改的项目将反映在 QML 中?

4

2 回答 2

4

要将 C++ 映射暴露给 QML,而无需创建 QObject 派生类,您可以使用QQmlPropertyMap

主文件

// create our data
QQmlPropertyMap ownerData;
ownerData.insert("name", QVariant(QString("John Smith")));
ownerData.insert("phone", QVariant(QString("555-5555")));
// expose it to the UI layer
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("owner", &ownerData);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

main.qml

Window {
    Text { text: owner.name + " " + owner.phone }
}

绑定是动态的 - 每当更新键的值时,绑定到该键的任何内容也将更新。不用setContextProperty每次换的时候打电话QQmlPropertyMap

于 2015-01-30T04:38:59.713 回答
0

您可以创建一个具有 QVariantMap 属性的 QObject 并将该对象设置为 contextObject(有关 contextObject 的文档,请参见http://doc.qt.io/qt-5/qqmlcontext.html#details)。在你的 QML 中,你可以全局使用“map”属性,当你调用 MyVariantMap::setMap() 时它应该更新。

class MyVariantMap : public QObject {
    Q_OBJECT
    Q_PROPERTY(QVariantMap map READ map WRITE setMap NOTIFY mapChanged)

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

signals:
 void mapChanged();

private:
    QVariantMap Map;

};
于 2015-01-29T20:18:10.723 回答