You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过信号槽在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:32:19