在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();
}