在Qt Quick中一个简单Hello World加载过程
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加载过程的更多相关文章
- 【模块化编程】理解requireJS-实现一个简单的模块加载器
在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...
- Android中用URL模拟一个简单的图片加载器
首先,需要添加权限. <uses-permission android:name="android.permission.INTERNET"/> 整体代码如下: pac ...
- 【旧文章搬运】Windows中全局钩子DLL的加载过程
原文发表于百度空间,2011-03-24========================================================================== 看雪上别人 ...
- 在Qt中如何编写插件,加载插件和卸载插件(转)
Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库.由于在开发项目的过程中,要开发一套插件 ...
- Qt Quick中的信号与槽
在QML中,在Qt Quick中,要想妥善地处理各种事件,肯定离不开信号与槽,本博的主要内容就是整理Qt 中的信号与槽的内容. 1. 链接QML类型的已知信号 QML中已有类型定义的信号分为两类:一类 ...
- python中一个简单的webserver
python中一个简单的webserver 2013-02-24 15:37:49 分类: Python/Ruby 支持多线程的webserver 1 2 3 4 5 6 7 8 9 10 11 ...
- 一个简单的CS系统打包过程图文版
一个简单的CS系统打包过程图文版 1. 打包内容 1.1. 此次打包的要求和特点 主工程是一个CS系统: 此CS系统运行的先决条件是要有.Net Framework 3.5: 主工程安装完成 ...
- 使用RequireJS并实现一个自己的模块加载器 (一)
RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...
- Android中插件开发篇之----动态加载Activity(免安装运行程序)
一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...
随机推荐
- 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库——安装配置OPEN-SSH,设置主机节点之间免密互访
配置root用户免密互访(为了方便,各台系统中使用统一的证书文件)一.安装Open-SSH 1,查询系统中是否安装了openssh [root@]# opm -qa |grep ssh 如已安装,则列 ...
- <数字签名是什么>笔记
此篇是看 数字签名是什么? 的理解与笔记 1. 使用非对称密钥发送数据到服务器. 发送方(C端)使用公钥对自己的数据进行加密,接收方(S端)使用私钥解密,即使发送出去的数据被拦截到,也不知道 ...
- 利用PowerShell监控Win-Server性能
Q:如何系统层面的去监控一下Windows Server? A:额……一时间的话……能想到的可能也就是PowerShell+SQL Server+job,试试. 1.关于PowerShell 2.Po ...
- python if,for,while
# -*- coding:utf-8 -*- # 第四章 if for while #布尔逻辑 print True == False print True and False print True ...
- react 路由导航栏 withRouter
codesandbox https://codesandbox.io/s/9l6prnyxjy app.js import React, { Component, Fragment } from &q ...
- CString 成员函数用法
参考文档:http://www.cnblogs.com/Caiqinghua/archive/2009/02/16/1391190.html CString的构造函数CString( );例:CStr ...
- 选择结构的三角关系Switch、Case、Default!!!
选择结构的三角关系Switch.Case.Default!!! 今天我们学习选择结构进化章节——Switch结构,他与if有什么区别呢? 相同点: 都是用来处理多分支条件的结构 不同点: switch ...
- HDU 1241 - Oil Deposits - [BFS]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241 题意: 求某块平面上,连通块的数量.一个油田格子若周围八个方向也有一个油田格子,则认为两者相连通 ...
- BrowserRoute服务器配置
BrowserRoute服务器配置 在React项目中我们经常需要采用React-Router来配置我们的页面路由,React-Router 是建立在 history 之上的,常见的history路由 ...
- 【ArcGIS for Server】制作并发布GP服务--缓冲分析为例
https://www.cnblogs.com/d2ee/p/3641279.html https://www.jianshu.com/p/5331fa708fe5 https://www.cnblo ...