在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(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...
随机推荐
- python 解除装饰器,调用原本函数。
假设fun函数被装饰器装饰了,name调用fun,就不是调用fun本身了,那么如何继续调用本身呢.使用fun_raw = fun.__wrapped__这样使用fun_raw就是调用没被装饰器修饰后的 ...
- MySQL 数据热备份
mysqlhotcopy使用lock tables.flush tables和cp或scp来快速备份数据库.它是备份数据库或单个表最快的途径,完全属于物理备份,但只能运行在数据库目录所在的机器上. 与 ...
- 【GIS】无人机相关技术(转)
---------------------------------------------------------------------------------------------------G ...
- Linux date 命令
date命令用于打印或设置系统日期和时间,常见用法如下: [root@localhost ~]# date //查看当前时间 [root@localhost ~]# date +"%Y-%m ...
- monit官方摘录
Here are the legal global keywords: Keyword Function ----------------------------------------------- ...
- monit检测语法
1.存在性检测 功能:检测文件或者服务不存在时进行相应的动作,默认是重启 语法: IF [DOES] NOT EXIST [[<X>] <Y> CYCLES] THEN ...
- 松散的css
<style> <p>hello world</p> {} p { color: red; } {} <em style="padding: 4px ...
- 关于 systemctl --user status 报错的问题
关于 systemctl --user enable mpd 报错: Failed to connect to bus: No such file or directory 因为arch脚本中,sys ...
- 原生js的remove方法代表删除节点
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- eclipse中的快捷键的使用