C++中调用QML对象

 


所有的QML对象类型,包括QML引擎内部实现或者实现第三方库,都是QObject子类,都允许QML引擎使用Qt元对象系统动态实例化任何QML对象类型。

在启动QML时,会初始化一个QQmlEngine作为QML引擎,然后使用QQmlComponent对象加载QML文档,QML引擎会提供一个默认的QQmlContext对象作为顶层执行的上下文,用来执行QML文档中定义的函数和表达式。

QQmlEngine::rootContext() 返回当前引擎QML的上下文,唯一的,QQmlContext* QQuickView::rootContext()
QQuickItem* QQuickView::rootObject() 返回当前QQuickView的根节点,也就是QML的根节点

1、使用C++加载QML对象

(1)使用QQmlComponent进行加载,读取QML文档,将转换成C++对象,进行赋值操作。

实例

复制代码
1 QQmlEngine engine;                                                                                 //QML引擎
2 QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///main.qml")));                        //加载QML
3 //用QQmlComponent创建一个组件的实例,并且赋值给object*,这步操作非常关键,Object类型可以转换其他任意类型,比如QQuickItem
4 QObject* object = component.create();                   
5 object->setProperty("width", 500);                                                           //元对象系统赋值操作
6 QQmlProperty(object, "width").write(500);                                                    //元对象系统赋值操作
7 QQuickItem* item = qobject_cast<QQuickItem*>(object);                                        //把 QObject* 转换成 QQuickItem* 类型
8 tiem->setWidth(500);                                                                         //QQuickItem* 赋值操作
复制代码

(2)使用QQuickView加载,QQuickView是继承QWindow,所有可以加载一个可视化QML对象,并且可以与应用程序的图形用户界面进行融合。

实例

1 QQuickView view;                                                                   //QQuickView对象
2 view.setSource( QUrl(QStringLiteral("qrc:///main.qml")));                          //加载QML
3 view.show();                                                                       //QQuickView可以显示可视化QML对象
4 QQuickItem* item = view.rootObject();                                              //返回当前QQuickView的根节点
5 tiem->setWidth(500);                                                               //QQuickItem* 赋值操作

 

2、使用对象名字访问加载的QML对象

QML中的所有节点都会绑定到根节点树上,QObject::objectName这个属性保存特定对象。QML组件的子对象可以在C++中通过 QObject::findChild()查找到在QML中用objectName定义的对象。

bool QObject::setProperty(const char *name, const QVariant &value)  元对象系统的设置函数
T QObject::findChild(const QString &name = QString(), Qt::FindChildOptionsoptions = Qt::FindChildrenRecursively) const  是一个QObject类型的模板函数,意味着可以转成任意类型如:

1 QPushButton* button = root.findChild<QPushButton*>("qml_button")
2 
3 QObject* object = root.findChild<QObject*>("qml_object")
4 
5 QQuickItem* item = root.findChild<QQuickItem*>("qml_item")

如果有多个对象使用objectName:"qml_button"同名标记,QObject::findChild返回最后一个标记的QML对象,QObject::findChildren返回所有标记的QML对象存放在QList类型的列表中。

实例

复制代码
 1 QQuickView view;                                                              //QQuickView对象
 2 view.setSource( QUrl(QStringLiteral("qrc:///main.qml")));                     //加载QML
 3 view.show();                                                                  //QQuickView可以显示可视化QML对象
 4 QQuickItem* root = view.rootObject();                                         //返回当前QQuickView的根节点,底下可以绑定很多节点
 5                                                                               //在根节点root中查找有objectName:"qml_button"这个标志位保存的QML节点qml_Button
 6 QObject* button = root->findChild<QObject*>("qml_button");       
 7 button->setProperty("width", 500);
 8 //在根节点root中查找有objectName:"qml_item"这个标志位保存的QML节点qml_item,换成QQuickItem*类型
 9 QQuickItem* item = root->findChild<QQuickItem*>("qml_item");   
10 item->setProperty("color", "red");
复制代码

3、使用C++访问QML对象成员

(1)所有的QML对象都会暴露在Qt的元对象系统,C++可以通过元对象系统的QMetaObject::invokeMethod()调用QML中注册到元对象系统函数。

实例

1 // qml中定义的函数:
2 function qmlFunction(msg)
3 {
4     console.log("QML get message:",msg);
5 }
复制代码
1 // C++调用QML函数:
2 QQmlEngine engine;                                                                         //QML引擎
3 QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///main.qml")));                 //加载QML
4 QObject* object = component.create();                 //用QQmlComponent创建一个组件的实例,并且赋值给object*,这步操作非常关键,Object类型可以转换其他任意类型,比如QQuickItem
5 QVariant rValue;
6 QVariant msg = "Hello for C++"
7 QMetaObject::invokeMethod(object,  "qmlFunction",  Q_RETURN_ARG(QVariant,rValue),  Q_ARG(QVariant, msg));
复制代码

(2)C++可以接收所有的QML信号,QML也可以接收C++信号,在C++中可以使QObject::connect()进行接收信号槽。

实例

// qml中定义一个信号:
signal qmlSignal(string msg)
1 // C++进行连接信号:
2 QQuickView view;                                                                       //QQuickView对象
3 view.setSource( QUrl(QStringLiteral("qrc:///main.qml")));                              //加载QML
4 view.show();                                                                           //QQuickView可以显示可视化QML对象
5 QQuickItem* root = view.rootObject();                                                  //返回当前QQuickView的根节点,底下可以绑定很多节点
6 QObject::connect(root,  SIGNAL(qmlSignal(QString)),  this,  SLOT(Slotqml(QString)));

 

posted @   taohuaxiaochunfeng  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示

目录导航