
正文Qt Quick 标准架构QML 负责界面展示C 负责业务逻辑、底层运算、硬件 / 网络操作。二者交互是混合开发核心。一、交互前置规则暴露给 QML 的 C 类必须继承 QObject属性、方法、信号槽需要使用 Qt 元对象系统Q_OBJECT宏对外接口优先使用Q_PROPERTY、Q_INVOKABLE、槽函数。二、步骤 1编写可供 QML 调用的 C 类头文件qmlhelper.hcpp运行#ifndef QMLHELPER_H #define QMLHELPER_H #include QObject #include QString class QmlHelper : public QObject { Q_OBJECT // 1. 暴露属性QML可读写/绑定 Q_PROPERTY(QString msg READ getMsg WRITE setMsg NOTIFY msgChanged) public: explicit QmlHelper(QObject *parent nullptr); // 属性读写接口 QString getMsg() const; void setMsg(const QString str); // 2. Q_INVOKABLE允许QML直接调用的普通成员函数 Q_INVOKABLE QString getHello(const QString name); signals: // 3. 信号C发送信号QML接收 void msgChanged(); private: QString m_msg; }; #endif // QMLHELPER_H源文件qmlhelper.cppcpp运行#include qmlhelper.h QmlHelper::QmlHelper(QObject *parent) : QObject(parent) { } QString QmlHelper::getMsg() const { return m_msg; } void QmlHelper::setMsg(const QString str) { if(m_msg ! str) { m_msg str; emit msgChanged(); // 触发信号 } } QString QmlHelper::getHello(const QString name) { return Hello name; }三、步骤 2注册 C 类到 QML 引擎main.cpp两种注册方式全局注册类、注册实例对象常用。cpp运行#include QGuiApplication #include QQmlApplicationEngine #include QQmlContext #include qmlhelper.h int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; QmlHelper helper; // 关键将C对象暴露为QML全局上下文属性 engine.rootContext()-setContextProperty(CppHelper, helper); const QUrl url(uqrc:/main.qml_qs); engine.load(url); return app.exec(); }CppHelper是 QML 中使用的对象名。四、步骤 3QML 调用 Cmain.qml1. QML 读取 / 修改 C 属性2. QML 调用 C 函数3. QML 接收 C 信号qmlimport QtQuick 2.15 import QtQuick.Controls 2.15 Window { width: 400 height: 200 visible: true Column { anchors.centerIn: parent spacing: 10 // 显示C属性 Text { text: CppHelper.msg; font.pixelSize: 16 } // 按钮点击调用C函数 Button { text: 调用C方法 onClicked: { let ret CppHelper.getHello(QML); console.log(ret) CppHelper.msg 来自QML的赋值; // 修改C属性 } } } // 接收C发出的信号 Connections { target: CppHelper onMsgChanged: { console.log(C属性发生变化) } } }五、交互总结QML → C调用Q_INVOKABLE函数、读写Q_PROPERTY属性C → QMLC 发送信号QML 通过Connections接收核心依赖QObject元对象系统 上下文注册。小结混合开发标准流程编写 QObject 子类 → 注册到 QML 上下文 → QML 直接访问对象、属性、方法、信号。该模式是大型 Qt Quick 项目的主流架构。