Qt5基本类图:

QQmlEngine
    QQmlEngine类提供了一个QML引擎,用于管理由QML文档定义的对象层次架构,QML提供了一个默认的QML上下文(根上下文,获取函数QQmlEngine::rootContext())。该上下文是QML表达式的执行环境,并且保证在使用时对象属性能够被正确更新。
    QQmlEngine可以将全局设置应用到其管理下的所有QML对象,比如网络通信:QNetworkAccessManager、全局永久(整个程序生命周期)存储的文件路径(资源预加载)等

QQmlContext
    QQmlContext提供了对象实例化和表达式执行所需要的上下文环境。所有的QML对象都要在特定的上下文中实例化,所有的表达式都要在特定的上下文中执行。上下文以根上下文为主组成层次结构,子上下文继承父上下文的属性,修改子上下文的属性值可以覆盖父上下文的属性值。
    QQmlContext::setContextProperty()能够通过名字将数据显示绑定到上下文,定义、更新上下文的属性
【注意】使用QQmlContext::setContextProperty()显示设置对象的属性会优先于上下文对象的属性

QQmlComponent
    QML文档定义的对象类型可以在运行时使用QQmlComponent类进行实例化,QQmlComponent封装了QML组件(component)的定义,可以用于加载QML文档,前提条件是需要QQmlEngine实例化QML文档中定义的对象层次结构。
    QQmlComponent实例既可以使用C++直接创建,也可以通过Qt.createComponent()函数在QML代码中创建

QQmlExpression
    动态执行表达式QQmlExpression允许客户端,在C++中利用一个特定的QML上下文执行JavaScript表达式,表达式执行的结果以QVariant的形式返回,并且遵守QML引擎确定的转换规则。

加载过程
每一个,Qt Quick函数都必须要有唯一 一个QQmlEngine引擎用于加载QML文件,唯一 一个QQmlContext用于QML对象实例化和表达式执行的上下文环境,一个QQmlComponent组件用于实例化第一个QML对象。一般QML加载方式有两种。

1、QGuiApplication + QQmlApplicationEngine + Window
我们在Qt Creator新建一个Qt Quick的hello world工程都是默认使用这种方式加载的。由上图的继承关系可以看出,
QGuiApplication:会调用父类的轮询函数 [static] int QCoreApplication::exec(),让Qt函数一直在跑在主线程轮询
QQmlApplicationEngine:使用父类的QQmlEngine引擎用于加载QML文件
Window:这是QML中主节点,对于的C++类是QQuickWindow,是一个可视化的QML对象
******************************* main.cpp **************************************
#include <QGuiApplication>
#include <QQmlApplicationEngine>
intmain(intargc,char*argv[])
{
QGuiApplication app(argc,argv);
QQmlApplicationEngine engine; //QML引擎对象
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); //使用引擎直接加载QML对象进行实例化
returnapp.exec(); //qt轮询函数,在主线程轮询
}
******************************* main.qml **************************************
importQtQuick2.3
importQtQuick.Window2.2
Window{ //可视化的QML对象
visible:true
Text{
text:qsTr("HelloWorld")
anchors.centerIn:parent
}
}
此方法还有一种经常使用的写法:
QQmlEngine engine;                                                                                 //QML引擎
QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///main.qml")));       //使用QQmlComponent加载QML对象
QObject* object = component.create();                   //用QQmlComponent创建一个组件的实例化,并且赋值给object*,这步操作非常关键,Object类型可以转换其他任意类型,比如QQuickItem
object->setProperty("width", 500);                                                           //元对象系统赋值操作
QQmlProperty(object, "width").write(500);                                              //元对象系统赋值操作
QQuickItem* item = qobject_cast<QQuickItem*>(object);                    //把 QObject* 转换成 QQuickItem* 类型
tiem->setWidth(500);                                                                               //QQuickItem* 赋值操作

2、QGuiApplication + QQuickView + Item
QGuiApplication:会调用父类的轮询函数 [static] int QCoreApplication::exec(),让Qt函数一直在跑在主线程轮询
QQuickView:使用父类的显示函数进行显示[slot] void QWindow::show()
Item:这是QML中主节点,对于的C++类是QQuickItem,是一个不可视的QML对象,所以依赖C++的显示
例子:
******************************* main.cpp **************************************
#include <QGuiApplication>
#include<QQuickView>
#include<QQuickItem>
intmain(intargc,char*argv[])
{
QGuiApplication app(argc,argv);
QQuickView view;                                                                       //QQuickView对象
view.setSource( QUrl(QStringLiteral("qrc:///main.qml")));       //加载QML
view.show();                                                                                //QQuickView可以显示可视化QML对象
QQuickItem* item = view.rootObject();                                    //返回当前QQuickView的根节点
tiem->setWidth(500);                                                                //QQuickItem* 赋值操作
returnapp.exec(); //qt轮询函数,在主线程轮询
}
---------------------
作者:西_瓜_瓜
来源:CSDN
原文:https://blog.csdn.net/xi_gua_gua/article/details/62238497
版权声明:本文为博主原创文章,转载请附上博文链接!

在Qt Quick中一个简单Hello World加载过程的更多相关文章

  1. 【模块化编程】理解requireJS-实现一个简单的模块加载器

    在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...

  2. Android中用URL模拟一个简单的图片加载器

    首先,需要添加权限. <uses-permission android:name="android.permission.INTERNET"/> 整体代码如下: pac ...

  3. 【旧文章搬运】Windows中全局钩子DLL的加载过程

    原文发表于百度空间,2011-03-24========================================================================== 看雪上别人 ...

  4. 在Qt中如何编写插件,加载插件和卸载插件(转)

    Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库.由于在开发项目的过程中,要开发一套插件 ...

  5. Qt Quick中的信号与槽

    在QML中,在Qt Quick中,要想妥善地处理各种事件,肯定离不开信号与槽,本博的主要内容就是整理Qt 中的信号与槽的内容. 1. 链接QML类型的已知信号 QML中已有类型定义的信号分为两类:一类 ...

  6. python中一个简单的webserver

     python中一个简单的webserver 2013-02-24 15:37:49 分类: Python/Ruby 支持多线程的webserver   1 2 3 4 5 6 7 8 9 10 11 ...

  7. 一个简单的CS系统打包过程图文版

    一个简单的CS系统打包过程图文版 1.     打包内容 1.1.  此次打包的要求和特点 主工程是一个CS系统: 此CS系统运行的先决条件是要有.Net Framework 3.5: 主工程安装完成 ...

  8. 使用RequireJS并实现一个自己的模块加载器 (一)

    RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...

  9. Android中插件开发篇之----动态加载Activity(免安装运行程序)

    一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...

随机推荐

  1. 如何在 Fiddler Script 中 自定义 修改 Request 、 Response

    Fiddler是一个http协议调试代理工具,方便进行http请求的拦截处理.改写请求.返回值等. 在Rules菜单下:  此次更改请求 头 ,so go to OnBeforeRequest 或者 ...

  2. JavaScript系统对象

    1. 本地对象(非静态对象) 常用对象有: Object.Function.Array.String.Boolean.Number.Date.RegExp.Error 注:本地对象需要new之后再使用 ...

  3. odoo11社区版python依赖库相对odoo10的变化

  4. [VS SVN] VS的SVN插件AnkhSvn

    VS的SVN插件AnkhSvn   修改VS配置  将解决方案或项目加入SVN管理

  5. JavaSE 可变参数的方法重载

    /** * 可变参数的方法重载 */ class A { public void test(int a, int b) { System.out.println(a+", "+b) ...

  6. 【转】- 从FM推演各深度CTR预估模型(附代码)

    从FM推演各深度CTR预估模型(附代码) 2018年07月13日 15:04:34 阅读数:584 作者: 龙心尘 && 寒小阳 时间:2018年7月 出处: 龙心尘 寒小阳

  7. LPVOID 没有类型的指针

    可以将LPVOID类型的变量赋值给任意类型的指针,比如在参数传递时就可以把任意类型传递给一个LPVOID类型为参数的方法,然后在方法内再将这个“任意类型”从传递时的“LPVOID类型”转换回来. 示例 ...

  8. jquery截取地址栏中url参数的值

    <script> /*http://127.0.0.9/index.php?s=/Home/Index/fangguan_shuju&zc=2*/ function getQuer ...

  9. To be better —msup荣获平安科技“2018年度优秀合作伙伴”称号

    2018年12月4日,平安科技在深圳平安金融中心举办了“2018年平安科技优秀培训合作伙伴交流会”,msup收到了邀请参与此次评选,并从80余家合作伙伴中脱颖而出,在交付量.满意度.师资内容.服务水准 ...

  10. asp.net mvc ef 性能监控调试工具 MiniProfiler

    MiniProfiler是一款针对.NET, Ruby, Go and Node.js的性能分析的轻量级程序.可以对一个页面本身,及该页面通过直接引用.Ajax.Iframe形式访问的其它页面进行监控 ...