【QML】QML与cpp交互(一)—— QML直接调用cpp函数
目录
1、cpp 创建一个类
2、将类对象暴露给QML
3、QML通过对象直接调用cpp函数
1、cpp 创建一个类
类模板如下:
#include <QtCore/QObject>
class vacUdpClient: public QObject
{
Q_OBJECT
public:
vacUdpClient(QObject* parent = nullptr): QObject(parent) {}
// Q_INVOKABLE 将当前函数暴露给QML
Q_INVOKABLE double triggerClickEvent(const QString& qstr);
private:
/* data */
};
要求:
- 使用 Q_OBJECT 宏需要继承 QObject 类。Q_OBJECT能够启用信号和槽机制、使用动态属性系统。(使用 Q_OBJECT 宏的类需要通过Qt的元对象编译器(moc)进行处理。)
- 使用 Q_INVOKABLE 修饰要暴露给 QML 的函数。
2、将类对象暴露给QML
使用 setContextProperty 将 c++ 对象注册为qml可以识别的对象,setContextProperty两个参数表示的意义为:
- 第一个参数表示 qml 可以识别的对象名
- 第二个参数表示 C++ 对象
#include <QtQml/QQmlContext>
#include "vacUdpClient.h"
/*** main.cpp ***/
vacUdpClient udpclient;
QQmlContext* context = engine.rootContext();
context->setContextProperty("udpclient", &udpclient);
3、QML通过对象直接调用cpp函数
import QtQuick 2.0
import QtQuick.Controls 2.0
ApplicationWindow {
width: 360
height: 360
visible: true
Text {
anchors.centerIn: parent
text: "Hello, QML!"
}
Button {
id: sendBtn
text: "发送"
onClicked: {
// 这里的 udpclient 对应setContextProperty的第一个参数
// triggerClickEvent 是 Q_INVOKABLE 暴露出来的函数
udpclient.triggerClickEvent("hello, world!")
}
}
}