在现代 Qt 开发中,QML(Qt Quick)负责 UI 层,C++ 负责逻辑层或后端服务层 是一种非常流行的架构方式。

这一模式下,信号与槽机制在 QML 与 C++ 间的前后端通信中扮演桥梁角色,是实现数据驱动界面更新、事件响应、属性绑定的核心手段。


📖 一、通信目标概览

通信方向技术方式
QML → C++调用槽函数,或触发 C++ 信号
C++ → QML发出信号,QML 使用 onXyzChanged 响应
属性绑定使用 Q_PROPERTY + NOTIFY

📦 二、基本实现结构

我们将实现一个简单的交互:

  • C++ 后端类 Backend 中定义一个计数器属性 counter
  • QML 前端界面显示该值;
  • QML 按钮点击后触发 C++ 的槽函数修改值;
  • C++ 属性变化通过信号通知 QML 自动刷新 UI。

🛠 三、完整代码示例

✅ 1. Backend.h

#ifndef BACKEND_H
#define BACKEND_H#include <QObject>class Backend : public QObject {Q_OBJECTQ_PROPERTY(int counter READ counter WRITE setCounter NOTIFY counterChanged)public:explicit Backend(QObject *parent = nullptr);int counter() const;void setCounter(int value);Q_INVOKABLE void increment();  // QML 可调用方法signals:void counterChanged();private:int m_counter;
};#endif // BACKEND_H

✅ 2. Backend.cpp

#include "Backend.h"Backend::Backend(QObject *parent) : QObject(parent), m_counter(0) {}int Backend::counter() const {return m_counter;
}void Backend::setCounter(int value) {if (m_counter != value) {m_counter = value;emit counterChanged();  // 通知 QML 自动更新绑定值}
}void Backend::increment() {setCounter(m_counter + 1);
}

✅ 3. main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "Backend.h"int main(int argc, char *argv[]) {QGuiApplication app(argc, argv);QQmlApplicationEngine engine;// 创建 Backend 实例Backend backend;// 注册给 QML 上下文engine.rootContext()->setContextProperty("backend", &backend);engine.load(QUrl(QStringLiteral("qrc:/main.qml")));if (engine.rootObjects().isEmpty())return -1;return app.exec();
}

✅ 4. main.qml

import QtQuick 2.15
import QtQuick.Controls 2.15ApplicationWindow {width: 300height: 200visible: truetitle: "QML ↔ C++ 信号槽通信"Column {anchors.centerIn: parentspacing: 20Text {font.pixelSize: 24text: "Counter: " + backend.counter}Button {text: "增加计数器"onClicked: backend.increment()}}// 监听属性变化(可选)Connections {target: backendonCounterChanged: {console.log("Counter updated to", backend.counter)}}
}

💡 四、关键技术点解读

1. Q_PROPERTY + NOTIFY

使 counter 成为 QML 可读写属性,支持绑定更新。

2. Q_INVOKABLE

increment() 成为 QML 可直接调用的方法。

3. setContextProperty()

将 C++ 对象注册到 QML 的命名空间中(backend)。

4. Connections 对象(可选)

在 QML 中响应 C++ 的信号,可以在不绑定属性的场景中使用。


🧠 五、进阶:QML 调用槽 / 发射信号(双向通信)

✅ QML 发出信号 → C++ 槽响应

QML:

signal sendData(string msg)Button {text: "发送数据"onClicked: sendData("Hello C++")
}

C++:

QObject* root = engine.rootObjects().first();
QObject::connect(root, SIGNAL(sendData(QString)),backendObj, SLOT(receiveData(QString)));

✅ C++ 发出信号 → QML onXxx 响应

QML:

Connections {target: backendonCustomSignal: {console.log("接收到来自 C++ 的信号")}
}

C++:

emit customSignal();

📊 六、常见面试问题与答题建议

问题答题要点
如何将 C++ 属性绑定到 QML?使用 Q_PROPERTY + NOTIFY,通过 setContextProperty 注册对象
QML 如何调用 C++ 方法?使用 Q_INVOKABLE 修饰或将槽暴露
C++ 如何通知 QML 属性变化?使用信号,如 emit counterChanged()
如何实现 QML → C++ 的通信?QML 信号连接到 C++ 槽函数
C++ → QML 怎么连接?通过 Connections、属性绑定或 QMetaObject::invokeMethod()

✅ 七、总结

技术点用途
Q_PROPERTY暴露属性给 QML
Q_INVOKABLE暴露方法给 QML
NOTIFY让属性支持绑定/变化通知
setContextProperty()注册对象到 QML 上下文
Connections 组件响应 C++ 信号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93961.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93961.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93961.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

孔夫子旧书网 API 实战:古籍与二手书数据获取及接口调用方案

孔夫子旧书网作为国内知名的古籍、二手书交易平台&#xff0c;其商品数据对于图书收藏、学术研究及二手书电商系统具有重要价值。本文将详细介绍孔夫子平台接口的调用方法&#xff0c;涵盖认证机制、搜索参数配置、数据解析及反爬策略&#xff0c;并提供可直接使用的 Python 代…

文件包含的学习笔记

面试问题 1&#xff0c;任意文件读取&#xff0c;到底读什么文件&#xff0c;有什么危害 权限是www 只能读第一个&#xff0c;读这个没用&#xff0c;密码在/etc/shadow中 其它没有权限 my.cnf mysql密码看不了 但是可以看见日志文件的目录 sql注入时&#xff0c;你有注…

Linux 软件包安装和管理的相关操作及使用总结(未完成)

一、基础知识1、软件包分类源码包&#xff08;Source Package&#xff09;&#xff1a;包含软件的源代码文件、编译指令和配置文件。需要用户自行编译安装&#xff0c;过程相对复杂&#xff0c;但灵活性高&#xff0c;可以定制安装选项。文件格式通常为.tar.gz、.tar.bz2等压缩…

【开发指南】飞凌i.MX9352核心板开发过程中的常见问题及排查思路

飞凌嵌入式作为NXP金牌合作伙伴&#xff0c;已基于i.MX系列应用处理器推出了多款嵌入式主控产品&#xff0c;除了最新发布的i.MX95xx系列核心板外&#xff0c;同为i.MX9系的i.MX93xx系列核心板也已上市多年并获得了众多客户的认可和选择。在长期的技术支持服务过程中&#xff0…

Windows应急响应一般思路(二)

进程排查 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结构的基础 无论是在Windows系统还是Linux系统中&#xff0c;主机在感染恶意程序后&#xff0c;恶意程序都会启动相应的进程&am…

FFmpeg03:多媒体文件处理基础

日志系统 #include <libavutil/log.h>av_log_set_level(AV_LOG_DEBUG)av_log(NULL, AV_LOG_INFO, “…%s\n”, op) 常用日志级别 AV_LOG_ERROR AV_LOG_WARNING AV_LOG_INFO Demo log.cpp #include <iostream> extern "C" { #include <libavutil/log.h…

【每天一个知识点】AIOps 与自动化管理

一、AIOps 的内涵AIOps&#xff08;Artificial Intelligence for IT Operations&#xff09;&#xff1a;指将人工智能、大数据分析和机器学习技术应用于 IT 运维管理中。主要目标是&#xff1a;利用智能算法对云平台、网络、应用和日志等海量运维数据进行实时分析&#xff0c;…

ios使用saveVideoToPhotosAlbum 保存视频失败提示 invalid video

ios使用saveVideoToPhotosAlbum 保存视频失败提示 invalid video 解决办法 iOS 上对保存到相册的视频存在某种格式和分辨率上的限制&#xff0c;建议先自查看下视频生成的参数&#xff0c;可以先试试苹果自带浏览器 safari 上能否播放该视频。 如果不能播放&#xff0c;证明 io…

Vue基础(③父子组件)

房子&#xff08;父组件&#xff09;包含窗户和门&#xff08;子组件&#xff09; 窗户和门&#xff08;子组件&#xff09;是房子&#xff08;父组件&#xff09;的一部分父组件<!-- 父组件&#xff1a;比如叫 Home.vue --> <template><div><h1>这是父…

AI领域的语义空间是什么?

写在前面&#xff1a;本文将从简单的二维空间来逐渐展开问题&#xff0c;带您理解语义空间。距离和体型&#xff1a;这里尝试用距离和体型这两个尺度来理解语义空间&#xff0c;先说的是低维情况&#xff0c;后面在尝试理解高维的情况。比如&#xff0c;在二维空间的x,y坐标系&…

排序---插入排序

基本思想对于插入排序而言&#xff0c;它的基本思想就是往已经排好序的序列里边插入数据。思想类似于玩扑克牌。接下来的排序都是基于下边的这个数组。int a[ ] { 5 , 3 , 9 , 6 , 2 , 4 , 7 , 1 , 8 };直接插入排序我们想要将这个数组排成升序&#xff0c;在最一开始&#xf…

Java性能优化实战(四):IO与网络优化的4个关键方向

IO与网络操作是Java应用性能的常见瓶颈&#xff0c;尤其在高并发场景下&#xff0c;低效的IO处理会导致响应缓慢、资源浪费等问题。本文将聚焦IO与网络优化的四个核心方向&#xff0c;通过真实案例、代码对比和性能数据&#xff0c;详解如何提升IO效率、减少网络传输开销&#…

对齐Wireshark和USRP捕获信号的波形

一、USRP信号 USRP捕获信号的波形如下&#xff1a; 放大后&#xff1a; 100ms 10ms 1ms 100us 10us 1us 二、波形分析 2.1 时间分辨率 采样率61.44MHz, 对应时间分辨率为1/61.44us0.01627us16.27ns。 这时间分辨率够用了&#xff0c;数据包长度为1到20us&#xff1a; 2.2 W…

2025年加密软件技术深度分析:从原理到企业级应用实践

一、加密技术基础与分类加密技术作为信息安全的核心基石&#xff0c;其基本原理是通过特定算法将明文数据转换为不可读的密文&#xff0c;只有持有正确密钥的授权用户才能解密还原。2025年主流的加密技术可分为三大类&#xff1a;‌对称加密‌&#xff1a;使用相同密钥进行加密…

打工人日报20250822

打工人日报20250822 对自己负责&#xff0c;可以是换一个角度看待自己不喜欢的工作&#xff0c;转换一个角度&#xff0c;从中找到自己感兴趣的点 真的非常不想计算声场的数据 啊啊啊啊啊 技术 STM32烧录问题 STM32 代码烧录失败&#xff1a;Error: Flash Download failed …

消费盲返模式:重构快消行业营销生态的破局之道与风险防控指南

一、模式爆发&#xff1a;快消行业的新增长引擎在流量成本攀升、用户留存困难的商业环境下&#xff0c;消费盲返模式正成为零售领域的一匹黑马。其核心逻辑在于通过"消费即投资"的机制设计&#xff0c;将每笔交易转化为后续100笔订单的激励源&#xff0c;形成独特的&…

STM32-FreeRTOS快速入门指南(上)

第一章 FreeRTOS系统配置 1. FreeRTOSConfig.h文件 针对 FreeRTOSConfig.h 文件&#xff0c;在 FreeRTOS 官方的在线文档中有详细的说明&#xff0c;网址为&#xff1a; https://www.freertos.org/a00110.html FreeRTOS 使用 FreeRTOSConfig.h 文件进行配置和裁剪。 FreeRTOSCo…

南溪智融双碳示范基地建筑设备管理系统 + 智能照明系统调试完成:筑牢 “绿色智能” 运营基石

南溪智融双碳示范基地作为聚焦 “双碳” 目标的标杆项目&#xff0c;其建筑设备管理系统与智能照明系统的调试完成&#xff0c;标志着基地在 “设备高效运维、能源精准管控、低碳场景落地” 方面迈出关键一步。两大系统深度契合示范基地 “以技术赋能双碳” 的核心定位&#xf…

c++的可扩展性方法

在C编码中&#xff0c;"方便扩展"通常指的是代码设计具有良好的**可维护性、可重用性和灵活性**&#xff0c;能够在不修改原有代码或仅少量修改的情况下&#xff0c;轻松添加新功能、支持新类型或适应新需求。以下是一些典型的、体现“方便扩展”思想的C编程案例&…

加速车辆开发 风丘道路载荷数据采集 (RLDA) 测试方案

一、背景 整车厂在汽车上市前&#xff0c;了解产品所能承受的载荷是非常重要的&#xff0c;因此需进行道路载荷数据采集&#xff08;RLDA&#xff09;测试。通过获得车辆在实际试验场或公路道路中行驶的载荷信息来为整车台架道路模拟试验提供目标信号输入&#xff0c;以及为用于…