正文
Qt Quick 标准架构:QML 负责界面展示,C++ 负责业务逻辑、底层运算、硬件 / 网络操作。二者交互是混合开发核心。
一、交互前置规则
- 暴露给 QML 的 C++ 类必须继承 QObject;
- 属性、方法、信号槽需要使用 Qt 元对象系统(
Q_OBJECT宏); - 对外接口优先使用
Q_PROPERTY、Q_INVOKABLE、槽函数。
二、步骤 1:编写可供 QML 调用的 C++ 类
头文件qmlhelper.h
cpp
运行
#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.cpp
cpp
运行
#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(u"qrc:/main.qml"_qs); engine.load(url); return app.exec(); }CppHelper是 QML 中使用的对象名。
四、步骤 3:QML 调用 C++(main.qml)
1. QML 读取 / 修改 C++ 属性
2. QML 调用 C++ 函数
3. QML 接收 C++ 信号
qml
import 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++ → QML:C++ 发送信号,QML 通过
Connections接收; - 核心依赖:
QObject+元对象系统 + 上下文注册。
小结
混合开发标准流程:编写 QObject 子类 → 注册到 QML 上下文 → QML 直接访问对象、属性、方法、信号。该模式是大型 Qt Quick 项目的主流架构。