QML与C++集成<一>——<运行环境以及相关运行时类介绍>

一、概要

  Qt提供了Qwidget和QML两种编程方式,这里主要讲解二者组合的编程方式,因为QML引擎与Qt的元对象系统的集成,使得在QML中可以直接调用C++的功能,这种机制还允许QML、JavaScript、C++三者进行混合开发。在QML引擎中集成了Qt元对象系统,所以QObject子类能够将数据或函数提供给QML使用,由QObject派生的所有子类的属性、方法和信号等都可以在QML中访问,QObject的子类将功能暴露给QML的方式如下:

  • C++类可以注册未一个可实例化QML类型,这样就可以像其他普通QML对象类型一样在QML代码中被实例化使用;
  • C++类可以被注册为一个单例类型,这样就可以在QML代码中导入这个单例对象实例
  • C++类的实例可以作为上下文属性或上下文对象嵌入到QML代码中

二、QML运行环境加载

  QML应用程序通常有以下两种加载QQmlEngine:

  • 1、通过 QQuickView 搭配Item加载 QML 文件,
  • 2、创建一个 QQmlApplicationEngine,并搭配Window 加载 QML 文件

  QQmlApplicationEngine提供了从一个QML文件里面加载应用程序的方式。
这类联合了QQmlEngine和QmlComponent去加载单独的QML文件。他还向QML提供了应用程序的功能,这个应用程序的功能能够让C++与QML混合编程,使用C++控制业务逻辑,用QML做界面,与QQuickView不同的是,QQmlApplicationEngine不会自动创建一个根窗口,如果使用可视化项目,需要将他们放入Window里。

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}

  使用QQuickView显示QML文档,对窗口的控制权(比如设置窗口标题、Icon、窗口的最小尺寸等)在C++代码;而使用QQmlApplicationEngine加载以Window为根对象的QML文档,QML文档则拥有窗口的完整控制权,可以直接设置标题、窗口尺寸等属性。

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQuickView viewer;
    viewer.setResizeMode(QQuickView::SizeRootObjectToView);
    viewer.setSource(QUrl("qrc:///main.qml"));
    viewer.show();
    return app.exec();
}

  一般的,应用程序会初始化一个QQmlEngine类作为QML引擎,然后使用QQmlComponent对象加载QML文档,QML引擎会提供一个默认的QQmlContext对象作为顶层上下文(可有QQmlEngine::rootContext()获取),用来执行QML文档中定义的函数和表达式,如果加载QML文档没有任何错误,QML文档定义的对象层次将使用QQmlcomponent的create创建,当所有对象创建完毕时则会将控制权交给Qt的事件循环系统。

三、运行时的C++类

3.1 QQmlEngine

  QQmlEngine类提供了一个QML引擎,用于管理由QML文档定义的对象层次结构,QML引擎提供了一个默认的QML上下文也就是根上下文,它提供了表达式的执行环境。

QQmlApplicationEngine engine;
engine.addImportPath(path + "/CommonControls");
engine.load(QUrl(QStringLiteral("qrc:/LoginView.qml")));

3.2 QQmlContext

  QQmlContext提供了对象实例化和表达式执行所需的运行时上下文,所有的对象都需要在一个特定的上下文中实例化,所有表达式都要在一个特定的上下文中执行。

3.3 QQmlComponent

  QML文档定义的对象类型可以在运行时使用QQmlComponent类型进行实例化,既可以使用C++直接创建,也可以通过Qt.createComponent()函数在QML代码中创建。

  QQmlComponent封装了QML组件的定义,可以用于加载QML文档:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QQmlEngine engine;
    QQmlComponent component(&engine, QUrl::fromLocalFile("../myqml/main.qml"));

    QObject *myObject = component.create();
    QQuickItem *item = qobject_cast<QQuickItem*>(myObject);
    qreal width = item->width();
    qDebug() << width;

    return a.exec();
}

3.4 QQmlExpression

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

原文地址:https://www.cnblogs.com/laiyingpeng/p/12335608.html

时间: 2025-01-15 04:32:36

QML与C++集成<一>——<运行环境以及相关运行时类介绍>的相关文章

Jsp运行环境——Tomcat

JSP JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1] 是由Sun Microsystems公司倡导.许多公司参与一起建立的一种动态网页技术标准.JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp). 用JSP开发的Web应用是跨平台的,既能在Linux下

node.js中的交互式运行环境-REPL

<Node.js权威指南>第2章Node.js中的交互式运行环境--REPL 开发者可以在该环境中很方便地输入各种JavaScript表达式并观察表达式的运行结果. 在学习Node.js框架的过程中,通过该运行环境的使用,我们可以很方便地了解Node.js中定义的各种对象所拥有的各种属性及方法.本节为大家介绍在REPL运行环境中操作变量 2.2 在REPL运行环境中操作变量 在REPL运行环境中,可以使用var关键字来定义一个变量并为其赋值,但是在输入了对其赋值进行的表达式后,该表达式的执行结

Node.js权威指南 (2) - Node.js中的交互式运行环境——REPL

2.1 REPL运行环境概述 / 102.2 在REPL运行环境中操作变量 / 102.3 在REPL运行环境中使用下划线字符 / 122.4 在REPL运行环境中直接运行函数 / 122.5 在REPL运行环境中定义并启动服务器 / 132.6 REPL运行环境中的上下文对象 / 132.7 REPL运行环境中的基础命令 / 142.8 小结 / 17

NodeJs&gt;-------&gt;&gt;第二章:Node.js中交互式运行环境--------REL

第二章:Node.js中交互式运行环境--------REL 一:REPL运行环境概述 1 C:\Users\junliu>node 2 > foo = 'bar' ; 3 'bar' 4 > 二:在REPL运行环境中操作变量 1 C:\Users\junliu>node 2 > foo='bar' 3 'bar' 4 > var foo='bar' 5 undefined 6 > 1 console.log("foo='bar'"); //控

Ecstore安装篇-1.运行环境初始化

Ecstore单机运行环境初始化 Ecstore运行环境要求 应用软件版本信息 Nginx 5.3.29 PHP 5.3.29

开发环境与运行环境需求

项目开发环境需求 项目软件开发环境基于Java.首先,考虑到团队想学习Java的开发与应用:其次,项目团队成员都具有一些Java的基础知识结构:借鉴了<Android数据库程序设计>,同时也参考了Android UI设计中响应式用户界面与设计模式.软件的开发环境主要用到了Eclipse,一个基于Java的可扩展性平台. 项目运行环境需求 软件运行环境基于Android系统的手机端应用,4.0以上版本都适合此软件的运行需求.

Linux -- Web服务器配置及PHP解释器的安装;JSP运行环境的配置(Tomcat安装)

一.PHP运行环境的配置 PHP是超级文本预处理语言PHP Hypertext Preprocessor的嵌套缩写.PHP是一种HTML内嵌式的语言,PHP与微软公司的ASP颇有几分相似,都是一种在服务器端执行的"嵌入HTML文档的脚本语言",语言的风格类似于C语言,现在被很多的网站编程人员广泛运用.PHP独特的语法混合了C.Java.Perl以及PHP自创新的语法.它可以比CGI或者Perl更快速地执行动态网页.用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML

Java集成开发环境--Eclipse for J2EE配置JRE运行环境

.d1 { border-style: none } .d2 { border-style: solid } .d3 { border-style: dotted } .d4 { border-style: dashed } .d5 { border-style: double } .d6 { border-style: groove } .d7 { border-style: ridge } .d8 { border-style: inset } .d9 { border-style: out

Java开发和运行环境的搭建

Java开发需要准备的东西? JDK+Eclipse 其中JDK的意思是Java开发工具包,Eclipse是进行用于做Java程序开发的工具(当然你也可以用记事本什么的去做). 其他开发工具:JCreator,JBuilder,... jdk的介绍和安装教程度娘里面到处都是,这里自己也在啰嗦一下吧. 关于jdk的详细介绍: JDK是Java Development Kit的缩写,即Java开发工具集.JDK是整个Java的核心,包括了Java运行环境(JRE).Java开发工具和Java基础类库