news 2026/6/11 6:02:55

Qt Quick 05|QML 与 C++ 交互:C++ 暴露属性 / 方法、QML 调用 C++

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt Quick 05|QML 与 C++ 交互:C++ 暴露属性 / 方法、QML 调用 C++

正文

Qt Quick 标准架构:QML 负责界面展示,C++ 负责业务逻辑、底层运算、硬件 / 网络操作。二者交互是混合开发核心。


一、交互前置规则

  1. 暴露给 QML 的 C++ 类必须继承 QObject
  2. 属性、方法、信号槽需要使用 Qt 元对象系统(Q_OBJECT宏);
  3. 对外接口优先使用Q_PROPERTYQ_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++属性发生变化") } } }

五、交互总结

  1. QML → C++:调用Q_INVOKABLE函数、读写Q_PROPERTY属性;
  2. C++ → QML:C++ 发送信号,QML 通过Connections接收;
  3. 核心依赖:QObject+元对象系统 + 上下文注册。

小结

混合开发标准流程:编写 QObject 子类 → 注册到 QML 上下文 → QML 直接访问对象、属性、方法、信号。该模式是大型 Qt Quick 项目的主流架构。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 5:59:54

嵌入式通信实战:用C语言把浮点数拆成HEX-ASCII码发送(附完整代码)

嵌入式通信实战&#xff1a;用C语言实现浮点数到HEX-ASCII的高效转换在物联网设备与嵌入式系统开发中&#xff0c;数据通信的效率和可靠性往往是项目成败的关键。当我们面对温度传感器输出的23.78℃或压力传感器传回的1013.25hPa时&#xff0c;这些浮点数如何穿越UART、CAN或Lo…

作者头像 李华
网站建设 2026/6/11 5:56:54

分布式学习中的信息聚合与DAG框架应用

1. 分布式学习中的信息聚合基础在机器学习领域&#xff0c;分布式学习已经成为处理大规模数据和复杂模型的重要范式。这种学习方式通过将计算任务分散到多个节点上执行&#xff0c;不仅提高了训练效率&#xff0c;也增强了系统的可扩展性。信息聚合作为分布式学习的核心机制&am…

作者头像 李华
网站建设 2026/6/11 5:52:01

VectorBT参数优化实战:5个高效策略提升你的量化交易优势

VectorBT参数优化实战&#xff1a;5个高效策略提升你的量化交易优势 【免费下载链接】vectorbt The backtesting engine that gives you an unfair advantage. Run thousands of trading ideas before others finish one. 项目地址: https://gitcode.com/gh_mirrors/ve/vecto…

作者头像 李华
网站建设 2026/6/11 5:45:51

从Pixel到你的手机:GKI如何让Android内核更新像系统OTA一样简单?

从Pixel到你的手机&#xff1a;GKI如何让Android内核更新像系统OTA一样简单&#xff1f;拿起手机检查系统更新&#xff0c;你可能已经习惯了每月收到的安全补丁和偶尔的大版本升级。但你是否想过&#xff0c;这些更新背后隐藏着一个更复杂的层面——内核更新&#xff1f;传统An…

作者头像 李华
网站建设 2026/6/11 5:41:00

用PyQt6打造一个交互式三国武将能力分析面板(附完整源码)

用PyQt6打造交互式三国武将能力分析面板&#xff1a;从数据到可视化实战三国时期英雄辈出&#xff0c;每位武将都有独特的统帅、武力、智力等能力属性。如何将这些数据直观呈现&#xff0c;让历史爱好者一目了然地比较武将优劣&#xff1f;本文将带你用PyQt6构建一个功能完整的…

作者头像 李华
网站建设 2026/6/11 5:38:47

模板驱动型文档操作系统:自动化排版与云原生PDF生成原理

1. 项目概述&#xff1a;当模板不再是“套壳”&#xff0c;而是一套可执行的文档操作系统你有没有过这种体验&#xff1a;手头有一篇写得不错的行业分析&#xff0c;想快速变成一份体面的PDF报告发给客户&#xff1b;或者刚录完一期播客&#xff0c;想把文字稿整理成带封面、目…

作者头像 李华