【Qt之Quick模块】6. QML语法详解_1 基础语法与三种导入语句

前言

通过以上1-5文档的介绍,Quick与QML的概念及QML语法、类型、文件作用等已叙述个大概,接下来是对QML语法进行展开来说。

其实,学习任何一门语言或者做任何一件事情,并不用一开始就要求尽善尽美,做个无懈可击;如果可以做到是最好,最不到也不用气馁。子曰:温故而知新,可以为师矣。

保持好心态,每天都有所收获,不亦乐乎?

关于1-5文档内容链接如下:

  1. 概述及Quick应用程序创建流程
    链接: https://blog.csdn.net/MrHHHHHH/article/details/135069075
  2. 创建Qt Quick UI工程
    链接: https://blog.csdn.net/MrHHHHHH/article/details/135073614
  3. QML类型
    链接: https://blog.csdn.net/MrHHHHHH/article/details/135105211
  4. QML语法格式及命名规范
    链接: https://blog.csdn.net/MrHHHHHH/article/details/135127788
  5. QML基本类型及示例用法
    链接: https://blog.csdn.net/MrHHHHHH/article/details/135142260

语法基础:示例说明

import QtQuickWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Rectangle{width: 200height: 200border.color: "blue"property color nextColor : "red"onNextColorChanged:console.log("nextColor:" + nextColor.toString())property list<Rectangle> childRects: [Rectangle{color:"red"},Rectangle{color:"blue"}]MouseArea{anchors.fill: parentonClicked: {for(var i = 0; i < 2; ++i){console.log("color", i, parent.childRects[i].color)}}}}
}

在这里插入图片描述

  1. import
    import作用是导入对应的QtQuick模块,它包含了各种QML类型及相关的可使用的模块;
    如果不使用import语句,则import下面的Window类就无法使用
  2. 对象和属性
    之前的QtWidgets有一个对象树,QML文档呢也是一个对象树;
    上述代码,创建了两个对象:根对象Window和子对象Rectangle;
    对象声明如下:
对象类型
{}

大括号内包含了对象的id、属性值、子对象等。
每个根对象声明一般会指定一个id,可以通过这个id在其他对象中识别并引用该对象,id值在一个组件的作用域内必须是唯一的。
虽然id看起来和属性一样,但它并不是一个属性。更像是这个类型的引用。
接下来往下分析:

    Rectangle{width: 200height: 200x: 50y: 100}

Rectangle是一个对象的类型,如果使用了该类型,则代码中的Rectangle为对象或者实例。
对象一般都有属性值,如Rectangle,有宽、高、位置属性等。
属性是通过“属性:值”方式进行初始化,属性和值之间用隔开,每个属性后可以加;,也可以不加。如果写成一句的话,就必须添加;

        width: 200height: 200x: 50y: 100

或者

        width: 200;height: 200;x: 50;y: 100
  1. 注释
    大部分语言的注释其实都是类似的。
    单行注释:
// 该行是注释

多行注释:

/*多行注释
*/
  1. 赋值和绑定
    Rectangle{width: 200height: 200x: 50y: 100}

以上给出的int值呢,就是初始化赋值的。
当值内包含其他对象或属性的引用时,就进行了一个绑定。这样,当值改变时,属性会自动更新了新的值。
如:

	Item{width:200Rectangle{width: parent.width - 50height: 200x: 50y: 100}}

Rectangle的width属性和Item的width属性绑定,当Item的width属性改变时,Rectangle的width属性会自动更新。

  1. 布局
    界面美观全靠样式和布局,anchors.centerIn: parent使Rectangle处于parent的中央位置。
    除了anchors,QML还有其他多种布局。如Row、Column等
Rectangle{width: 200height: 200anchors.centerIn: parent}

在这里插入图片描述
6. 输出
在QtWidgets进行编程时,使用QDebug类进行调试输出;在QML中,使用console.logconsole.debug进行输出。

MouseArea{anchors.fill: parentonClicked: {for(var i = 0; i < 2; ++i){console.log("color", i, parent.childRects[i].color)}}}

在某个鼠标区域,点击,打印color
在这里插入图片描述

import导入语句

import语句允许客户端告诉引擎在QML文档中使用哪些模块、JavaScript资源和组件目录。可以在文档中使用的类型取决于文档导入了哪些模块、资源和目录。
默认情况,QML文档可以访问到同目录下的对象类型,不用import导入。
不导入会报错的。
import导入语句有三种不同类型的导入。每种导入类型的语法略有不同,不同的导入类型适用不同的语义。

  1. 模块(命名空间)导入

最常见的导入类型是模块导入。客户端可以导入QML模块,这些模块将QML对象类型和JavaScript资源注册到给定的名称空间中。
模块导入的一般形式如下:

 import <ModuleIdentifier> [<Version.Number>] [as <Qualifier>]
  • <ModuleIdentifier>是一个以点分隔URI表示法指定的标识符,它唯一地标识模块提供的类型命名空间。
  • <Version.Number>是MajorVersion的一个版本。MinorVersion,它指定了各种对象类型和JavaScript资源的哪些定义将由于导入而可用。它可以省略,在这种情况下,将导入模块的最新版本。也可以只省略次要版本。然后导入给定主版本的最新次要版本。
  • <Qualifier>是一个可选的本地命名空间标识符,如果给定,模块提供的对象类型和JavaScript资源将被安装到该标识符中。如果省略,模块提供的对象类型和JavaScript资源将被安装到全局命名空间中。

模块导入的示例如下:

 import QtQuick

此导入允许使用QtQuick模块提供的所有类型,而无需指定限定符。例如,创建矩形的客户端代码如下:

 import QtQuickRectangle {width: 200height: 100color: "red"}

带有version的不限定导入的示例如下:

 import QtQuick 2.10

在这种情况下,QtQuick 2.11及更高版本或更高主要版本(如6.0)中定义的任何类型都不能用于该文件。
一个限定模块导入的例子如下,这个很有用,如果自定义类型和QML类型中都含有某一类型,为了区别,就需要使用带有限定符的导入语句:

 import QtQuick as QuickQuick.Rectangle {width: 200height: 100color: "red"}
 import QtQuick as CoreItemsimport "../textwidgets" as MyModuleCoreItems.Rectangle {width: 100; height: 100MyModule.Text { text: "自定义Item!" }CoreItems.Text { text: "Qt Quick!" }}

在这里插入图片描述
请注意,如果QML文档没有导入提供特定QML对象类型的模块,而是试图使用该对象类型,则会发生错误。例如,下面的QML文档没有导入QtQuick,因此尝试使用矩形类型将失败:

 Rectangle {width: 200height: 100color: "red"}

在这里插入图片描述
在这里插入图片描述
在这种情况下,引擎将发出错误并拒绝加载文件。
从Qt6开始,已经移除了QML版本控制,导入模块不用指定版本号。

  1. 目录导入语句

包含QML文档的目录也可以直接导入到QML文档中。这为将QML类型划分为可重用的组提供了一种简单的方法:文件系统上的目录。
目录导入的一般形式如下:

import"<DirectoryPath>" [as <Qualifier>]

注意:导入路径是网络透明的:应用程序可以从远程路径导入文档,就像从本地路径导入文档一样简单。如果目录是远程的,它必须包含一个目录导入,其中列出qmldir文件,因为如果该qmldir文件不存在,QML引擎无法确定远程目录的内容。

<Qualifier>的类似语义适用于目录导入和模块导入。

可以导入QML文件的本地目录,而无需任何额外的设置或配置。也可以导入QML文件的远程目录,但需要存在一个列出qmldir文件的目录。本地目录可以选择性地包含一个目录清单qmldir文件,以便定义应该提供给导入该目录的客户端的类型名称,并指定应该向导入者提供的JavaScript资源。

  • 本地目录导入

本地文件系统上的任何QML文件都可以使用引用该目录的绝对或相对文件系统路径的import语句导入本地目录,从而使文件能够使用该目录中定义的对象类型。
如果本地目录包含列出qmldir文件的目录,则将使用qmldir文件中指定的类型名称提供类型;否则,它们将以从QML文档的文件名派生的类型名提供。只允许文件名以大写字母开头,以“”结尾。如果目录中没有指定qmldir文件,".qml"将作为类型公开。
Ex:
有一个QML项目目录结构。在顶层目录myapp下,有一组常用的UI组件在名为mycomponents的子目录下,主应用程序代码在名为main的子目录下,如下所示:
在这里插入图片描述
main/application.qml文件可以使用相对路径导入mycomponents目录,允许它使用该目录中定义的qml对象类型:
在这里插入图片描述
目录可以导入到限定的本地命名空间中,在这种情况下,目录中提供的任何类型的使用都必须是限定的:
在这里插入图片描述
导入本地目录的能力对于应用程序内组件集和应用程序原型等情况非常方便,尽管如果模块目录移动到另一个位置,任何导入此类模块的代码都必须更新其相关的导入语句。如果使用QML模块,则可以避免这种情况,因为导入的安装模块带有唯一标识符字符串,而不是文件系统路径。

  • 远程目录导入

如果QML文件目录包含一个列出qmldir文件的目录,也可以从远程位置导入该目录。
例如,如果上一个例子中的myapp目录托管在"http://www.my-example-server.com",并且mycomponents目录包含一个定义如下的qmldir文件:
在这里插入图片描述
然后,可以使用URL将该目录导入到远程mycomponents目录:
在这里插入图片描述注意,当一个文件通过网络导入一个目录时,它只能访问该目录中的qmldir文件中指定的QML和JavaScript文件。

警告:当从远程服务器导入目录时,开发人员应该始终小心,只从可信源加载目录,以避免加载恶意代码。

  • 目录清单qmldir文件

一个目录列表 qmldir 文件与模块定义 qmldir 文件有明显的不同。目录列表 qmldir 文件允许快速轻松地共享一组 QML 文档,但它不定义用于注册文档中定义的 QML 对象类型的类型命名空间,也不支持对这些 QML 对象类型进行版本控制。
目录列表 qmldir 文件的语法如下:

命令语法描述
对象类型声明<TypeName> <FileName>允许QML文档使用指定的类型名进行暴露,例子: RoundedButton RoundedBtn.qml
内部对象类型声明internal <TypeName> <FileName>内部对象类型声明允许将QML文档注册为仅对目录导入中包含的其他QML文档可用的类型。例子: internal HighlightedButton HighlightedBtn.qml
JavaScript资源声明<Identifier> <FileName>JavaScript资源声明允许通过给定的标识符公开JavaScript文件。例子: MathFunctions mathfuncs.js

本地文件系统目录可以选择性地包含qmldir文件。这允许引擎只向导入目录的客户机公开某些QML类型。此外,除非在qmldir文件中声明,否则目录中的JavaScript资源不会暴露给客户端。

  1. JavaScript资源导入语句

JavaScript资源可以直接导入到QML文档中。每个JavaScript资源都必须有一个用来访问它的标识符。
JavaScript资源导入的一般形式如下:

 import "<JavaScriptFile>" as <Identifier>
  • 来自模块的JavaScript资源

Javascript文件可以由模块提供,方法是在指定模块的qmldir文件中添加标识符定义。
例如,如果用下面的qmldir文件指定projects.MyQMLProject.MyFunctions模块,并安装到QML导入路径中:

 module projects.MyQMLProject.MyFunctionsSystemFunctions 1.0 SystemFunctions.jsUserFunctions 1.0 UserFunctions.js

如果模块被导入到文档本地命名空间中,JavaScript资源标识符必须以命名空间限定符为前缀才能使用:

 import QtQuickimport projects.MyQMLProject.MyFunctions as MyFuncsimport org.example.Functions as TheirFuncsItem {Component.onCompleted: {MyFuncs.SystemFunctions.cleanUp();TheirFuncs.SystemFunctions.shutdown();}}

QML导入路径

当导入一个已标识的模块时,QML 引擎会在导入路径中搜索匹配的模块。
导入路径由 QQmlEngine::importPathList() 返回,定义了引擎搜索的默认位置。默认情况下,该列表包括:

  • 当前文件所在的目录
  • QLibraryInfo::QmlImportsPath 指定的位置
  • 由 QML_IMPORT_PATH 环境变量指定的路径
  • 资源中的 qrc:/qt-project.org/imports 路径。

可以通过 QQmlEngine::addImportPath() 或 QML_IMPORT_PATH 环境变量添加其他导入路径。在运行 qml 工具时,还可以使用 -I 选项添加导入路径。
可以通过使用路径分隔符将多个导入路径连接起来,在 QML_IMPORT_PATH 环境变量中指定多个导入路径。在 Windows 上,路径分隔符是分号 (😉,在其他平台上是冒号 (😃。这意味着在 QML_IMPORT_PATH 中不能指定资源路径或 URL,因为它们本身包含冒号。不过,可以通过编程方式调用 QQmlEngine::addImportPath() 添加资源路径和 URL。

结论

可能第一次看有些摸不着头脑,第二次看也是,但全部看完,再回头看,轻舟已过万重山

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

datagrip将一个数据库中的数据_跨平台数据库管理神器DataGrip,用上就爱不释手...

原文链接&#xff1a;https://www.ffeeii.com/2041.htmlDataGrip是Jetbrains旗下众多优秀的效率生产工具之一。下载地址&#xff1a;https://www.jetbrains.com/datagrip/DataGrip是多引擎数据库环境&#xff0c;支持几乎常见的数据库类型&#xff1a;PostgreSQL、MySQL、Oracl…

栅格单元值的选取方法_ArcGIS中栅格数据重采样方法

2.用ArcGIS中的Resampling工具进行栅格重采样操作在ArcToolbox中依次找到Data Management Tools—>Raster—>RasterProcessing—>Resample工具&#xff0c;工具界面如下图所示&#xff1a;其中各参数含义如下&#xff1a;Input raster: 输入栅格数据集Output raster d…

城市轨道交通运营管理属于什么院系_专业介绍|城市轨道交通运营管理专业

原标题&#xff1a;专业介绍|城市轨道交通运营管理专业专业介绍丨城市轨道交通运营管理专业▲▲▲汽车工程系简介THE FIRST汽车工程系目前开设了汽车检测与维修技术、城市轨道交通运营管理、城市轨道交通通信信号技术等专业&#xff0c;在校学生700余人。汽车工程系突出复合型技…

idea 鼠标变量_IntelliJ IDEA鼠标悬停方法显示Java Doc

本问题已经有最佳答案&#xff0c;请猛点这里访问。我正在使用IntelliJ IDEA 9&#xff0c;是否可以配置IDEA&#xff0c;以便在将鼠标悬停在某个方法上时&#xff0c;IDEA会调出Javadoc(与CTRL Q相同)&#xff1f;看来&#xff0c;此功能可能最终会进入IntelliJ IDEA 12.1或1…

ad18敷铜为什么打的孔里面也有_PCB覆铜后放置大量过孔有什么作用?具体怎么放置?...

底层 顶层 共地下面摘抄的&#xff1a;过孔的多少不等同于决定某种实际的意义&#xff01;大家都知道在高频情况下&#xff0c;印刷电路板上的布线的分布电容会起作用&#xff0c;当长度大于噪声频率相应波长的1/20 时&#xff0c;就会产生天线效应&#xff0c;噪声就会通过…

python程序写完后点哪个运行快_让 Python 代码运行更快的最佳方式!

PyPy与CPythonPyPy是Python解释器CPython的直接替代品。CPython将Python编译为中间字节码然后由虚拟机解释&#xff0c;而PyPy使用实时(JIT)编译将Python代码转换为本地机器的汇编语言。根据正在执行的任务&#xff0c;性能提升可能会非常显着。平均而言&#xff0c;PyPy将Pyth…

idea下拉项目_推荐几款非常好用的IDEA插件(香)

每天进步一点点&#xff0c;坚持下去&#xff0c;你总是会不一样的。加油&#xff01;最近在整理Java常用的一些基础、ZooKeeper、Spring全家桶、源码、Dubbo、Elasticsearch、Redis、MySql、RabbitMQ、Kafka、Linux 、微服务等技术栈。持续更新中&#xff0c;欢迎点上面后端架…

python批处理代码_【原创源码】【python】python文本文件批处理

[Python] 纯文本查看 复制代码import osimport shutildef text_edit_vhd(filepath):with open(filepath,r) as file_head:content file_head.read()file_head.seek(0,0)file_head.write("protect begin \n" content)file_head.seek(0,2)file_head.write("\npr…

php 汉王云名片_汉王云-名片识别【最新版】_OCR_人工智能_API-云市场-阿里云

{"moduleinfo":{"advanList_count":[{"count_phone":4,"count":4}],"title":"云市场服务保障体系","mapList_count":[{"count_phone":4,"count":4}]},"advanList":[{&qu…

git 如何提取已提交的文件_git取两次提交的文件列表,包含目录信息

1.用git rev-list HEAD取得版本号列表&#xff1a;在SmartGit中看到的也是这样&#xff0c;验证了我们的猜想&#xff1a;取到两个版本号之后&#xff0c;用git diff命令&#xff1a;git diff [--options] ... [--] […​]这里的[-options]我们填的是--name-status&#xff0c;…

filco的pin码_一把强行帮你退烧的键盘 plum niz atom66静电容

一把强行帮你退烧的键盘 plum niz atom66静电容2019-09-10 10:37:578点赞17收藏14评论小编注&#xff1a;此篇文章来自即可瓜分10万金币&#xff0c;周边好礼达标就有&#xff0c;邀新任务奖励无上限&#xff0c;点击查看活动详情说起niz,正是个神奇的牌子,老板一个人就负责制作…

在fritzing中怎么导入_电路图制作软件(Fritzing)

Fritzing&#xff0c;图形化Arduino电路开发软件。Fritzing是个电子设计自动化软件。它支持设计师&#xff0c;艺术家&#xff0c;研究人员和爱好者参加从物理原型到进一步实际的产品。还支持用户记录其阿尔杜伊诺和其他电子为基础的原型&#xff0c;与他人分享&#xff0c;在教…

得力助手 消防员的 消防机器人_消防机器人市场如今的发展现状,是否能成为消防员的得力助手...

随着经济的不断发展&#xff0c;使消防和应急救援的要求越来越高。基础工业的快速发展也使得易燃、易爆和剧毒化学品引发火灾的可能性越来越高。一方面&#xff0c;今天的消防需要更详细的消防信息和更快的消防和救援速度。另一方面&#xff0c;在改革后的消防系统建立后&#…

自己配置python环境_windows下python环境的配置

1 安装python类似其他软件&#xff0c;点击下一步就行了注意选择把python.exe加入到path中&#xff0c;当然也可以自己手动配置验证python是否安装成功>>>后面输入代码&#xff0c;可以立即看到结果&#xff0c;c语言等利用{}来界定代码块&#xff0c;python利用缩进来…

ora 00900 已编译但有错误_技术分享|万万没想到!编译错误竟然还没灭绝???

CodeWisdom-技术分享万万没想到&#xff01;编译错误竟然还没灭绝&#xff1f;&#xff1f;&#xff1f;复旦大学CodeWisdom团队的代码分析和挖掘小组针对开源软件项目持续集成过程中出现的编译错误&#xff0c;进行了大规模的经验研究。该研究分析了常见的编译错误类型、修复代…

昆仑通态触摸屏数据转发上传_嵌_ModbusTcpIp数据转发 昆仑通态屏与屏之间通讯 - 下载 - 搜珍网...

嵌_ModbusTcpIp数据转发/通_通/发送方.MCG嵌_ModbusTcpIp数据转发/通_通/接收方.MCG嵌_ModbusTcpIp数据转发/通_通/驱动路径说明.txt嵌_ModbusTcpIp数据转发/通_通/ModBusTcp数据转发设备/ModbusTCPIPSlave.chm嵌_ModbusTcpIp数据转发/通_通/ModBusTcp数据转发设备/ModBusTCPIP…

直接用自己服务器做图床可以吗_图床有什么用,图片放自己的服务器上不可以吗?...

什么是图床服务器&#xff1a;图床就是图片在线存储服务器&#xff0c;主要是用来节省流量的&#xff0c;一些可以把图片存放到网上并且引用到其他网站使用的服务&#xff0c;就像以前的网络相册。一般用图床的&#xff0c;都是图片之类的静态文件非常多&#xff0c;把图片存储…

高职信息安全比赛攻防思路_高职信息安全技术应用技能竞赛.doc

高职信息安全技术应用技能竞赛.doc高职信息安全技术应用技能竞赛规程、评分标准及选手须知一、竞赛规程调整说明2011湖南省职业院校技能竞赛高职信息安全技术应用(以下简称“省赛”)竞赛规程&#xff0c;原则上采用“2011年全国职业院校技能大赛”高职信息安全技术应用(以下简称…

华宝小t股票机器人_华宝小T股票机器人

我试过两个品种&#xff0c;签约后会在管理介面标注算法对你持仓品种的效果(下挂多户时只支持添加默认主账户的持仓&#xff0c;且只限股票)&#xff0c;我试了两个标注为优秀的&#xff0c;一个益生股份&#xff0c;一个宏辉果蔬。单个品种下限大概是6万左右&#xff0c;会提示…

catia直线测距怎么调出来_CATIA怎么测量两线夹角.

在几何学中&#xff0c;角是由两条有公共端点的射线组成的图形。这两条射线叫做角的边&#xff0c;它们的公共端点叫做角的顶点。一般的角会假设在欧几里得平面上&#xff0c;但在欧几里得几何中也可以定义角。角在几何学和三角学中有着广泛的应用。它是轴对称图形&#xff0c;…