Data Type Conversion Between QML and C++
1.变量交互
方法一
QQmlContext::setContextProperty
直接将cpp中的变量注册进qml
1.声明
C++类中使用 Q_PROPERTY
宏声明一个可以从QML访问的属性 m_age
1
| Q_PROPERTY(QString m_age READ getAge WRITE setAge NOTIFY ageChanged)
|
2.注册
定义一个C++类,使用QQmlContex
的setContextProperty()
成员函数向QML运行上下文环境注册C++类型
1 2 3 4
| #include <QQmlContext> Datas datas; QQmlContext *qmlctx = engine.rootContext(); qmlctx->setContextProperty("cpp_datas",&datas);
|
Q_INVOKABLE
声明函数
3.使用
方法二
qmlRegisterSingletonType
模板函数注册一个单例类供Qml使用
qmlRegisterUncreatableType
注册一个QML不可实例化的类型
搭配使用,可以在cpp中管理对象,在QML中使用单例对象操作交互
1.声明
自定义全局单例类MyQmlGlocalControl
,管理QML使用的对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class MyQmlGlocalControl : public QObject { Q_OBJECT public: explicit MyQmlGlocalControl(QObject *parent = nullptr) { _testManager = new TestManager; }
Q_PROPERTY(TestManager* testManager READ testManager CONSTANT)
TestManager* testManager() { return _testManager; }
private: TestManager* _testManager; };
|
需要与QML 交互的对象 TestManager
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class TestManager : public QObject { Q_OBJECT public: explicit TestManager(QObject *parent = nullptr); Q_PROPERTY(int age READ age NOTIFY ageChanged) int age() { return _age; }
signals: void ageChanged();
private: int _age = 5; };
|
2.注册
1 2 3 4 5
| static QObject* myQmlGlobalSingletonFactory(QQmlEngine*, QJSEngine*) { MyQmlGlocalControl* qmlGlobal = new MyQmlGlocalControl; return qmlGlobal; }
|
1 2 3
| qmlRegisterUncreatableType<TestManager>("MyQml", 1, 0, "TestManager", "Reference only"); qmlRegisterSingletonType<MyQmlGlocalControl>("MyQml", 1, 0, "MyQml", myQmlGlobalSingletonFactory);
|
3.使用
1 2 3 4 5
| import MyQml 1.0 { property var _testManager: MyQml.testManager property int _age: MyQml.testManager.age }
|
2.信号交互
在变量交互的基础上,使用Connections
建立cpp/QML信号与QML槽的连接
1 2 3 4 5 6 7 8 9 10 11
| Connections { target: _testManager function onAgeChanged() { console.log("age changed :", _age) } onAgeChanged: { ... } }
|