我有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;
};