首页 文章

Qt5 QML QVariantMap绑定变更通知

提问于
浏览
0

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

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

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

2 回答

  • 0

    要将C map公开给QML,而不创建QObject派生类,可以使用QQmlPropertyMap .

    main.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")));
    

    main.qml

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

    绑定是动态的 - 每当您更改 QQmlPropertyMap 时,每当一个键's value is updated, anything bound to that key will be updated as well. Don'需要调用 setContextProperty 时 .

  • 4

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

相关问题