QML调用C++代码
2020-03-05 本文已影响0人
Gwkang
1. 首先编写好C++类
#include <QObject> class Cpp : public QObject { Q_OBJECT public: Cpp(); // Q_PROPERTY 注册类型为QString 的ss属性,可以在QML中初始化, NOTIFY表示修改之后会触发的信号 Q_PROPERTY(QString str READ getStr WRITE setStr NOTIFY strChanged) // Q_INVOKABLE 修饰的方法可以在QML中调用 // 如果C++方法想在QML中直接调用,需要用Q_INVOKABLE修饰,或者声明为public slots Q_INVOKABLE QString getStr(); Q_INVOKABLE void setStr(QString); signals: void strChanged(); private: QString str; };
- Q_PROPERTY 注册类型为QString 的ss属性,可以在QML中初始化, NOTIFY表示修改之后会触发的信号
- Q_INVOKABLE 修饰的方法可以在QML中调用
2. 将C++类注册到QML
#include <QGuiApplication> #include <QQmlApplicationEngine> #include "../cpp/cpp.h" int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); // 需要注册c++类型 // 参数1:QML中使用时倒入的 包名, 参数2和3时版本,参数4:在QML中使用时的类型名称 qmlRegisterType<Cpp>("Type.Cpp", 1, 0, "QmlCpp"); QQmlApplicationEngine engine; const QUrl url(QStringLiteral("qrc:/main.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); }
- C++类注册到QML
qmlRegisterType<Cpp>("Type.Cpp", 1, 0, "QmlCpp");
- 参数1:QML中使用时倒入的 包名, 参数2和3是版本,参数4:在QML中使用时的类型名称
- 首字母一定要大写,否则注册不进去!!!
3. QML使用C++注册的类型
import QtQuick 2.9 import QtQuick.Window 2.2 import Type.Cpp 1.0 Window { visible: true width: 640 height: 480 title: qsTr("Hello World") QmlCpp { id : cpp str : "QML调用C++" } Rectangle { anchors.centerIn: parent width: 100 height: 100 color: "#00ffffff" border.color: "#19e8d0" border.width: 5 radius: 10 Text { id: text text : cpp.getStr(); anchors.centerIn: parent } } }
import Type.Cpp 1.0
倒入包,就是main函数中注册的代码QmlCpp { id : cpp; str : "QML调用C++" }
创建类对象cpp.getStr();
调用对象的方法