QML 与 C++的交互可以分为4种形式:
- 注册 C++ 对象到 QML,在 QML 中访问 C++对象;(在QML调用C++)
- QML 暴露对象给 C++ 进行交互;(在C++中调用QML)
- C++ 创建 QML 对象并进行交互;
- C++ 对象与 QML 通过信号槽进行交互;
定义全局对象或上下文对象,该变量在QML文件中就可以直接访问
在main.cpp文件中定义该全局对象,其方法如下:
QQmlContext *context = engine.rootContext();
context->setContextProperty("全局对象名",值); //如("SCREEN_WIDTH", 400);
Q_INVOKABLE 是个宏定义,这个宏将函数声明为元对象系统可调用的函数,想要暴露的方法必须用 Q_INVOKABLE 修饰
1.注册 C++ 对象到 QML,在 QML 中访问 C++对象 ( 在QML调用C++ )
方法一:
在c++文件内将想要暴露的方法、对象等用 Q_INVOKABLE 修饰
(Q_INVOKABLE此宏应用于成员函数的声明,以允许通过元对象系统调用它们。宏被写在返回类型之前)
类名 对象名;//main.cpp
engine.rootContext()->setContextProperty("全局对象名", &其他类对象名); //main.cpp
完成以上操作,在QML文件中即可采用 全局对象名 . 其他C++文件的方法 实现交互
方法二:(常用)
将 C++ 类名注册到 QML ,并在QML 声明一个对象并进行访问
qmlRegisterType<MyQmlClass>("com.company.myqmlclass", 1, 0, "MyQmlClass");//main.cpp
其中:qmlRegisterType 模板函数中的 “com.company.myqmlclass” 为自定义的控件名称,类似于C++中的库名称。我们在 QML 中需要 import 这个控件名, “MyQmlClass” 为 C++ 注册的类名, 1和0 为自定义版本号,方便版本管理。
import com.company.myqmlclass 1.0 //QML文件
MyQmlClass{ id:myQmlImp} //QML文件
完成以上操作,在QML文件中即可采用 myQmlImp.函数名() 实现交互
方法三:
Q_PROPERTY(int value READ iValue WRITE setIValue NOTIFY iValueChanged)// mytest.hpp
value是mytest.hppl类在Main.cpp中实例化后的一个属性的名称
通过iValue函数读值,通过setIValue修改值,值修改后发送 iValueChanged信号