Qt5 QML QVariantMap 与更改通知绑定



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

问题是,当我更改 QVariantMap 时,甚至当我更改 QVariantMap 并为更新的对象调用 setContextProperty 时,或者当我更新 contextProperty 返回的(使用 fromValue)对象时,没有任何反应。所以这看起来像是一次性绑定。

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

若要向

QML 公开C++映射,而不创建 QObject 派生类,可以使用 QQmlPropertyMap。

主.cpp

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

主.qml

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

绑定是动态的 - 每当更新键的值时,绑定到该键的任何内容也将更新。每次更换QQmlPropertyMap时都不需要呼叫setContextProperty

您可以创建一个具有 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;
};

相关内容

  • 没有找到相关文章

最新更新