一、将c++对象注册到qml引擎中:
方法有很多种,这里只介绍下面这几种:
1.将c++类型导出为qml可以使用的类型
#include <QtQml> #include <QQmlApplicationEngine> ... ... //注册一定要放在qml上下文之前 //qmlRegisterType<对象名>("自定义的包名",主版本号,次版本号,"qml中的对象名"); qmlRegisterType<MyListModoule>("an.qt.ListModoule",1,0,"MyMoDoule"); ...
2.将c++中创建的对象作为属性传递到qml中
#include <QQmlApplicationEngine> #include <QQmlContext> ... QQmlApplicationEngine engine; //必须在load之前调用,new出来的对象还需要c++这边释放 engine.rootContex()->setContextProperty("test_qml",new Test); engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); ...
在qml中使用是,不需要像第一种方法 import,也不需要定义,可直接使用test_qml,类似于一种在qml中的单例对象。
二、c++类的定义
如果想要在qml中访问c++的类,必须先满足以下两点前置条件:
- 该类必须是QObject类的子类
- 使用Q_OBJECT宏
满足上述条件后,只要具有以下特征之一,即可被qml访问:
1. 信号、槽
只要是signals 和 slots定义的函数,都可以直接在qml中访问到
2. 使用了Q_INVOKABLE宏声明的函数
例如:
Q_INVOKABLE int GetValue(); Q_INVOKABLE void SetValue(int val);
一旦使用了Q_INVOKABLE宏,那么就可以在qml中使用${Object}.${method}来访问了
3. 使用Q_ENUMS宏
Q_ENUMS宏可以将类中枚举类型注册到元对象系统中
class Test : public QObject{ Q_OBJECT Q_ENUMS(Number) public: enum Number{ kOne = 1, kTwo, kThree, kFour }; };
这样就可以在qml中,直接使用${CLASS_NAME}.${ENUM_VALUE}的形式访问枚举变量了,如Test.kOne
4. Q_PROPERTY宏
Q_PROPERTY 宏用来定义可通过元对象 系统访问的属性。
常用选项有READ、WRITE、NOTIFY。
Q_PROPERTY(type name [READ getFunction] [WRITE setFunction] [NOTIFY changeSingle]) Q_PROPERTY(int value READ GetValue WRITE SetValue NOTIFY valueChanged)
Q_PROPERTY还有其他很多选项,但是都不常用。
定义了Q_PROPERTY宏的属性,可以在qml中通过READ对应的函数来获取属性值,通过WRITE属性对应的值来设置属性,通过关联NOTIFY抛出的信号来处理属性的改变。