当前位置: 首页 > news >正文

在C++业务类和QML之间创建一个数据桥梁

工作中经常会遇到两种业务直接按无法直接沟通,此时需要建立一个桥梁将两者进行联系起来,假设一个C++业务类,有一个QML UI,
如果将BridgeClass 类通过qmlRegisterType 注册到QML中,在C++中如何能够调用到BridgeClass 对象吗,在qml中的对象和C++业务中的BridgeClass 对象需要统一,如果在qml中创建了BridgeClass 对象,在C++中就不能创建BridgeClass 类对象,但是需要用到QML中创建的BridgeClass 对象,怎么能够使用呢?

代码如下仅供参考:
搭建一个桥梁代码:

class BridgeClass : public QObject
{Q_OBJECTQ_PROPERTY(QString data READ data NOTIFY dataChanged)
public:explicit BridgeClass(QObject *parent):QObject(parent){}QString data() const{}
public slots:void updateData(const QString& newData){}
signals:void dataChanged();
private:QString m_data;
};

UI QML代码

import QtQuick 2.15
import QtQuick.Window 2.15
import com.example.bridge 1.0Window {visible: truewidth: 640height: 480title: "Using BridgeClass in QML and C++"BridgeClass {id: qmlBridgeobjectName: "qmlBridge"  // 设置 objectName 以便在 C++ 中查找onDataChanged: {console.log("Data changed in QML:", data)}}Component.onCompleted: {qmlBridge.updateData("New data from QML")}
}

在main函数中注册BridgeClass

// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickItem>
#include <QDebug>
#include "bridgeclass.h"int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);// 注册 BridgeClass 到 QMLqmlRegisterType<BridgeClass>("com.example.bridge", 1, 0, "BridgeClass");QQmlApplicationEngine engine;engine.load(QUrl(QStringLiteral("qrc:/main.qml")));if (engine.rootObjects().isEmpty())return -1;// 获取 QML 的根对象QObject *rootObject = engine.rootObjects().first();// 查找 QML 中创建的 BridgeClass 对象QObject *qmlBridgeObject = rootObject->findChild<QObject*>("qmlBridge");if (qmlBridgeObject) {BridgeClass *bridge = qobject_cast<BridgeClass*>(qmlBridgeObject);if (bridge) {qDebug() << "Data from QML BridgeClass:" << bridge->data();bridge->updateData("New data from C++");}}return app.exec();
}

相关文章:

  • 力扣刷题Day 23:最长连续序列(128)
  • HarmonyOS-ArkUI:关键帧动画 keyFrameAnimateTo
  • vue部署到nginx服务器 启用gzip
  • Python 网络编程:TCP 与 UDP 协议详解及实战代码
  • 服务器口令长度、强度、时效限制
  • 基于Python Socket的多线程聊天程序案例分析
  • Springboot集成websocket实现消息推送
  • 【C++教程】C++中为什么优先使用 cout/cin流
  • Windows网络及服务:制作系统盘
  • rk3588上完成halcon的形状模型配准以及和opencv的图像转换
  • 算法 | 成长优化算法(Growth Optimizer,GO)原理,公式,应用,算法改进研究综述,matlab代码
  • 【MySQL】MySQL中的数据类型详解
  • 【前端】【面试】【业务场景】前端如何获取并生成设备唯一标识
  • 使用pyinstaller打包fastapi项目的问题记录
  • 01-初识前端
  • 级联vs端到端、全双工、轮次检测、方言语种、商业模式…语音 AI 开发者都在关心什么?丨Voice Agent 学习笔记
  • 深度学习3.5 图像分类数据集
  • 每日算法-250421
  • Java 并发包核心机制深度解析:锁的公平性、异步调度、AQS 原理全解
  • 【MySQL】:数据库事务管理
  • 电影“名场面”被制成表情包在网站上传播,网站运营者被判赔5500元
  • 著名水声学家陆佶人逝世,曾参加我国第一代核潜艇主动声纳研制
  • 新片|真人版《星际宝贝史迪奇》5月23日与北美同步上映
  • 这家企业首次签约参展进博会,为何他说“中资企业没有停止出海的步伐”
  • 新华社经济随笔:机器人“摔倒、爬起”的背后
  • 普京呼吁乌方响应和平倡议,称将分析民用设施停火提议