如何通过信号槽在QQuickWidget加载的QML中同步C++变量
实现C++属性与QML变量的同步更新
要让C++类WidgetEIS的modeEIS属性变化时同步更新QML中的对应变量,需完成以下关键步骤:
1. 完善C++类的属性读写逻辑
首先要确保setModeEIS方法正确修改属性值并触发modeEISChanged信号——这是QML能感知属性变化的核心前提:
class WidgetEIS : public QWidget { Q_OBJECT Q_PROPERTY(int modeEIS READ modeEIS WRITE setModeEIS NOTIFY modeEISChanged FINAL) public: explicit WidgetEIS(QWidget *parent = nullptr) : QWidget(parent), m_modeEIS(1) {} // 属性的读方法 int modeEIS() const { return m_modeEIS; } // 属性的写方法,修改值后必须触发通知信号 void setModeEIS(int newMode) { if (m_modeEIS != newMode) { m_modeEIS = newMode; emit modeEISChanged(); } } signals: void modeEISChanged(); private: int m_modeEIS; // 存储属性值的私有成员 QQuickWidget* eisWidget = nullptr; }; WidgetEIS::WidgetEIS(QWidget *parent) : QWidget(parent), m_modeEIS(1) { eisWidget = createQQuickWidget("MfdWidgetLeft", "qrc:/qml/WindowMFD/EIS/EIS.qml", 0, 57, 150, 683); // 步骤2:将当前WidgetEIS实例暴露给QML上下文 eisWidget->rootContext()->setContextProperty("widgetEIS", this); }
2. 将C++实例注册到QML上下文
在WidgetEIS构造函数中,通过QQuickWidget的rootContext()将当前类实例注册为QML可访问的上下文属性(这里命名为widgetEIS),让QML能直接访问C++对象的属性。
3. 修改QML代码绑定C++属性
删除QML中自行定义的modeEIS初始值,改为绑定到C++上下文属性的modeEIS,实现自动同步:
import QtQuick 2.9 import QtQuick.Controls 2.5 Rectangle { id: containerEIS width: 150 height: 683 visible: true // 绑定到C++对象的modeEIS属性,属性变化时自动同步 property int modeEIS: widgetEIS.modeEIS }
补充说明
- 确保
createQQuickWidget返回的QQuickWidget是有效初始化后的对象。 - 若需在QML中主动修改C++属性,可直接调用
widgetEIS.setModeEIS(newValue),同样会触发信号完成双向同步。
内容的提问来源于stack exchange,提问作者user15300301
相关产品推荐
相关产品推荐

