2015-01-29 1 views
0

У меня есть QVariantMap (не QObject, потому что имена свойств не предопределены). И я добавляю QVariantMap в корневой контекст QML, чтобы использовать значения свойств для привязки.Qt5 QML QVariantMap Связывание с уведомлениями об изменении

Проблема заключается в том, что при изменении QVariantMap или даже при изменении QVariantMap и вызове setContextProperty для обновленного объекта, или когда я обновляю (с помощью объекта fromValue), возвращаемый contextProperty, ничего не происходит. Таким образом, это выглядит как привязка времени.

Итак, каков правильный способ ввода карты или карты в QML-контекст наблюдаемым образом, так что изменение элемента на карте будет отражено в QML?

ответ

4

Выставить карту C++ в 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 } 
} 

Связывание динамична - всякий раз, когда значение ключевым обновляется, все, что связано с этим ключом будет обновлен. Не нужно звонить setContextProperty каждый раз, когда вы меняете QQmlPropertyMap.

+0

Спасибо, что сработало очень хорошо! – adontz

0

Вы можете создать QObject с свойством QVariantMap и установить этот объект в качестве объекта contextObject (см. http://doc.qt.io/qt-5/qqmlcontext.html#details для документации по объекту contextObject). В 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; 

}; 
Смежные вопросы