工作中经常会遇到两种业务直接按无法直接沟通,此时需要建立一个桥梁将两者进行联系起来,假设一个C++业务类,有一个QML UI,
如果将BridgeClass 类通过qmlRegisterType 注册到QML中,在C++中如何能够调用到BridgeClass 对象吗,在qml中的对象和C++业务中的BridgeClass 对象需要统一,如果在qml中创建了BridgeClass 对象,在C++中就不能创建BridgeClass 类对象,但是需要用到QML中创建的BridgeClass 对象,怎么能够使用呢?
代码如下仅供参考:
搭建一个桥梁代码:
class BridgeClass : public QObject
{
Q_OBJECT
Q_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.0
Window {
visible: true
width: 640
height: 480
title: "Using BridgeClass in QML and C++"
BridgeClass {
id: qmlBridge
objectName: "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 到 QML
qmlRegisterType<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();
}