【Qt之Quick模块】4. QML语法格式及命名规范
概述
QML(Qt Meta-Object Language)是一种声明式语言,用于设计用户界面。它是由Qt框架提供的一种描述界面组件的语言,可以与C++代码结合使用,用于创建跨平台的应用程序。
QML具有以下特点:
-
声明式:QML使用类似于JavaScript的语法,通过描述界面组件的属性和行为来创建用户界面。它不需要编写繁琐的布局和控件代码,使界面设计更加简洁和直观。
-
跨平台:QML可以在多个平台上运行,包括Windows、Linux、macOS、Android和iOS等。它提供了各种预定义的界面组件,可以适应不同的设备和操作系统。
-
可扩展:QML支持自定义组件的创建和重用。开发人员可以定义自己的QML类型,并将其用作其他QML组件的构建块。这种扩展性使得在QML中创建复杂的用户界面变得更加容易。
-
可视化编辑器:Qt Creator是Qt框架提供的开发工具,集成了QML的可视化编辑器。开发人员可以通过拖放和属性编辑的方式设计界面,无需编写代码。这种可视化编辑器大大提高了开发效率。
QML可以与C++代码结合使用,以实现更复杂的功能。可以通过QML调用C++的函数和对象,反之亦然。这种混合编程的能力使得开发人员可以充分利用Qt框架提供的功能,并且可以使用不同语言的优势进行开发。
QML格式
QML(Qt Meta-Object Language)是基于JavaScript的声明性
语言,关键点来了,它不是描述性语言,它是声明性语言,用于描述用户界面的结构和行为。以下呢是QML语言的基本格式:
- 导入模块:
import 模块名称 版本号
导入需要使用的模块,可以使用原生的Qt模块,也可以使用自定义的模块。
- 定义元素:
元素类型 {属性1: 值1属性2: 值2...子元素1 {...}子元素2 {...}...
}
使用元素类型创建一个新的元素,可以指定属性和子元素,并使用大括号包围元素的内容,一个QML文件中只有最外侧一个大括号。
- 定义属性:
属性名称: 值
定义一个属性,并将其赋予一个值。
- 使用JavaScript代码:
JavaScript代码
可以在QML文件中使用JavaScript代码,用于处理用户交互、计算等逻辑。
- 信号和槽:
signal 信号名称(参数类型1, 参数类型2, ...)
定义一个信号。
on信号名称: {槽函数
}
使用信号与槽连接。
- 事件处理:
Element {MouseArea {onClicked: {...}}
}
使用MouseArea元素处理鼠标点击事件。
以下是一个关于QML格式的小栗子,主要展示了QML语言的基本格式和用法:
import QtQuick 2.15Rectangle {width: 200height: 200color: "lightblue"Text {text: "Hello, QML!"font.pixelSize: 20color: "white"anchors.centerIn: parent}MouseArea {anchors.fill: parentonClicked: {console.log("Rectangle clicked!")Text.text = "Clicked!"}}
}
示例中,
- 首先,导入了QtQuick模块的2.15版本
- 其次,创建了一个名为Rectangle的元素,设置了宽度、高度和背景颜色
- 在Rectangle元素内部,创建了一个Text元素,设置了文本内容、字体大小和颜色,并使用anchors.centerIn将其居中显示
- 之后,创建了一个MouseArea元素,将其填充到父元素中,并在onClicked事件中添加了一段JavaScript代码。当鼠标点击Rectangle区域时,控制台将输出一条消息,并将Text元素的文本内容设置为"Clicked!"。
QML类型
QML类型主要是有以下四种类型:
- 由QML语言原生提供
- 通过QML模块通过c++注册
- 由QML模块作为QML文档提供
- 应用程序开发人员可以通过直接注册c++类型,或者通过在QML文档中定义可重用的组件(然后可以导入)来提供自己的类型
QML文件
在QML中,一个文件通常对应一个元素或组件。
QML文件是用于描述用户界面的脚本文件,可以包含一个或多个元素或组件的定义。每个元素或组件都由一个QML文件来描述,该文件定义了该元素或组件的属性、信号和方法等信息。
在QML文件中,通常会以一个根元素开始,该根元素可以是任何QML元素,例如Rectangle、Item、Text等。这个根元素可以包含其他子元素,形成一个元素的层次结构。
每个QML文件可以看作是一个独立的模块,可以在其他QML文件中引用和使用。在引用一个QML文件时,我们实际上是在使用该文件所描述的元素或组件。
如:
可以创建一个MyButton.qml
文件,其中定义了一个自定义按钮的外观和行为。然后在其他QML文件中使用该MyButton
组件,就可以重复利用这个自定义按钮的定义,而不用编写重复的代码。这样,每个QML文件都可以表示一个独立的元素或组件。
当然,有些时候一个QML文件可以定义多个相关联的元素或组件,但通常建议将每个元素或组件放在单独的QML文件中,以提高代码的可维护性和复用性。
简单来说就是,一个QML文件通常表示一个元素或组件,该文件定义了该元素或组件的属性、行为和外观等信息,可以在其他QML文件中引用和使用。
QML文件命名规范
QML文件的命名没有固定的规定,可以根据开发者的喜好和项目的需要进行命名。通常情况下,QML文件的命名可以与其中定义的自定义类型或组件相关联,以便更好地组织和管理代码。
例如,如果一个QML文件定义了一个名为Button
的自定义按钮组件,可以将该文件命名为Button.qml
,这样可以更清晰地表示该文件与按钮组件的关系。
但是,QML文件的名称并不直接影响它们在应用程序中的使用。在导入和使用QML文件时,可以使用任何名称来引用它们,只需要确保路径和文件名的拼写和大小写是正确的。
总之,QML文件的名称是开发者自己定义的,应该能够清晰地表示文件的用途和内容,以方便代码的组织和维护。
QML文件名称是否是元素名称或元素类型
QML文件内元素的类型并不是以文件名称来确定的,而文件名称是根据文件的内容和扩展名来确定的。通常,QML文件的扩展名为".qml"。
在QML中,可以创建多个类型的文件,例如:
- Item类型的文件,用于创建可重复使用的组件。
- Window类型的文件,用于创建应用程序的主窗口。
- Component类型的文件,用于定义可嵌套的组件。
当然,QML文件的类型也可以通过文件名的约定来表示,例如使用"Item.qml"表示Item类型的文件,使用"Window.qml"表示Window类型的文件。这种命名约定对于开发者来说是一种约定俗成的做法,并不是QML语言本身的规定。
在QML中,元素的名称实际上就是元素的类型。比如,Text元素的名称就是Text。
在QML中,使用元素的名称来创建该类型的元素。例如,要创建一个Text元素,可以直接使用其名称Text
,如下所示:
Text {// Text元素的属性和子元素
}
Text
就是Text元素的名称,它表示创建一个Text类型的元素。
QML中有许多内置的元素类型,每个类型都有自己的名称,比如Rectangle、Image、Button等。可以根据需要使用这些元素类型来创建想要的界面。
同时,也可以通过自定义元素类型来创建自定义的元素,并为它们定义属性和行为。
QML导入别的QML文件
在QML中,可以使用import
语句导入其他的QML文件。导入的QML文件可以是自定义类型的定义、QML模块,或者是其他已经导出为QML的组件。
例如,假设有一个名为Button.qml
的文件,其中定义了一个自定义的按钮类型:
import QtQuick 2.0Rectangle {width: 100height: 50property string text: "Button"MouseArea {anchors.fill: parentonClicked: console.log("Button clicked")}Text {anchors.centerIn: parenttext: parent.text}
}
然后,在另一个QML文件中可以使用import
语句导入并使用该自定义的按钮类型:
import QtQuick 2.0
// 导入Button.qml文件
import "Button.qml"Item {Button {text: "Click me"}
}
通过导入Button.qml
文件,可以在另一个QML文件中使用Button
类型的实例。可以给实例的属性赋值、监听信号等。这样就可以重用Button.qml
文件中定义的按钮组件了。
QML的文件名称是对qml文件内的元素的一个引用
QML文件的名称可以作为对文件内元素的引用。在QML文件中,可以定义多个元素,每个元素都可以在其他文件或同一个文件中通过其名称进行引用。
例如,假设有一个名为"Button.qml"的文件,其中定义了一个自定义按钮元素。可以在其他文件中引用这个自定义按钮元素并使用它。
Button.qml:
import QtQuick 2.0Rectangle {width: 100height: 40color: "blue"Text {text: "Click Me!"anchors.centerIn: parent}
}
Main.qml:
import QtQuick 2.0Rectangle {width: 200height: 200Button {}
}
在上述示例中,使用了Button.qml
文件中定义的自定义按钮元素。在Main.qml中直接使用Button元素,不需要为它设置id属性,因为没有特定引用它的需求。
通过QML文件的名称,可以在其他文件中引用并使用其中的元素。这为之后在QML中组织和重用代码提供了便利。
QML文件的名称具体作用
QML文件的名称主要用于以下两个方面:
-
作为元素的类型引用:QML文件的名称可以作为元素的类型引用。当在一个QML文件中定义一个元素时,可以在其他QML文件或同一个文件中使用该元素,只需使用该元素所属的QML文件的名称作为类型。这样,可以通过QML文件的名称来创建和使用元素。
-
作为文件的引用:QML文件的名称也可以用于在其他QML文件中引用该文件。当一个QML文件依赖于其他QML文件时,可以使用该文件的名称来导入和使用其中的元素。这样,可以在不同的QML文件间建立依赖关系,方便模块化开发和代码重用。
需要注意的是,元素的类型引用和文件的引用是不同的概念。元素的类型引用是通过QML文件的名称来引用其中的元素,而文件的引用则是通过导入语句来引用其他QML文件。
总结来说,QML文件的名称用于标识文件中定义的元素的类型,同时也可以用于在其他文件中引用该文件。通过使用QML文件的名称,可以方便地创建、使用和组织QML元素。
以下是举例说明
:
当QML文件作为元素的类型引用时,可以在其他QML文件或同一个文件中使用该元素,通过使用QML文件的名称作为类型来创建和使用元素。
例如,假设有一个名为"Button.qml"的文件,其中定义了一个自定义按钮元素。之后可以在其他文件中引用这个自定义按钮元素并使用它。
Button.qml:
import QtQuick 2.0Rectangle {width: 100height: 40color: "blue"Text {text: "Click Me!"anchors.centerIn: parent}
}
Main.qml:
import QtQuick 2.0Rectangle {width: 200height: 200Button {} // 使用Button.qml文件中定义的自定义按钮元素
}
示例中,首先使用了Button.qml文件中定义的自定义按钮元素。之后在Main.qml中直接使用Button元素,不需要为它设置id属性,只需使用Button作为类型引用即可。通过QML文件的名称,可以方便地创建和使用元素。
当QML文件作为文件的引用时,可以使用导入语句将其他QML文件导入到当前文件中,以便引用其中的元素。
例如,有一个名为"Utils.qml"的文件,其中定义了一些通用的工具函数和常量。之后可以在其他QML文件中导入"Utils.qml",以便使用其中的工具函数和常量。
Utils.qml:
pragma Singleton
import QtQuick 2.0function formatDateTime(dateTime) {// 格式化日期和时间的函数// ...
}const MAX_VALUE = 100;
Main.qml:
import QtQuick 2.0import "Utils.qml" as Utils // 导入Utils.qml,并将其命名为UtilsRectangle {width: 200height: 200Text {text: Utils.formatDateTime(new Date()) // 使用Utils.qml中的函数}Text {text: Utils.MAX_VALUE // 使用Utils.qml中的常量}
}
示例中:
-
- 使用导入语句将"Utils.qml"导入到Main.qml中,并将其命名为Utils
-
- 在Main.qml中就可以使用Utils作为文件的引用来访问该文件中的函数和常量。
QML文件作为元素的类型引用和文件的引用都是通过使用QML文件的名称来进行引用的。前者用于创建和使用元素,而后者用于导入和访问文件中的元素和功能。
QML中,元素的名称是否是元素的Id
在QML中,元素的名称和元素的id是不同的。
元素的名称是用于识别元素类型的标识符,表示元素的类型和属性。例如,Rectangle
、Text
、Image
等都是QML中常见的元素名称。
而元素的id是元素的唯一标识符,用于在QML文件中引用该元素。通过为元素指定一个id,我们可以在同一文件或其他文件中使用该id来访问该元素的属性、调用其方法或与其交互。
在QML文件中,可以使用id
关键字为元素指定一个id。一旦元素拥有了id,就可以在同一文件中使用该id来引用该元素,或者通过使用QtObject.find(id)
方法在其他文件中查找该元素。
举个例子,假设在QML文件中创建了一个Rectangle元素,并给它指定了一个id为"myRect",那么就可以在该文件中使用myRect.width
来获取或设置该Rectangle元素的宽度属性。
名称是用于表示元素的类型和属性的标识符,而id则是用于在QML文件中唯一标识一个元素,以方便引用和操作该元素。
以上是关于QML语法格式及命令规范和文件的一些介绍。
相关文章:
【Qt之Quick模块】4. QML语法格式及命名规范
概述 QML(Qt Meta-Object Language)是一种声明式语言,用于设计用户界面。它是由Qt框架提供的一种描述界面组件的语言,可以与C代码结合使用,用于创建跨平台的应用程序。 QML具有以下特点: 声明式ÿ…...

Python内置类属性__class__属性的使用教程
概要 Python作为一种高级编程语言,提供了丰富的功能和灵活性,使得开发人员能够更加方便地处理各种任务。其中一个强大的功能是内置类属性__class__属性。本文将详细介绍__class__属性的用法,帮助读者更好地理解和利用这一功能。 第一部分&am…...

【后台报错】插入时sql报错,varchar撑爆
后台的一个报错。按照正常的需要复现,或者查一下日志。但是凭借多年经验和大胆猜测,以及对自己代码要自信 引用一下文章 目测7*15 105项。每个id有9个数字加上分隔符刚好十个。大概就是超过了定义的一千的varchar长度。直接改数据库就好了。 简单粗暴…...

OpenSergo使用详解
简介 OpenSergo是一个基于微服务治理的标准和生态,覆盖了服务元信息、流量治理、服务容错、数据库/缓存治理、服务注册发现、配置治理等十几个关键领域,覆盖了完整的微服务生命周期(从开发态到测试态,到发布态,再到运…...

Vanilla Pro for Mac 一款隐藏菜单栏图标工具
Vanilla Pro Vanilla Pro是一款简单易于使用的Mac应用程序,可让您隐藏菜单栏图标。只需下载Vanilla,启动应用程序,然后按照提示即可开始。 资源获取 Vanilla Pro for Mac 功能特性 键盘快捷键:设置自定义键盘快捷键来切换菜单…...

freemarkEngine文件ftl的可视化编辑
在做导出word文件功能时,需要准备ftl模板,设置一些通配符,之后通过相关编码,即可以实现业务数据渲染后导出word的功能。但是ftl文件一般我们看不太懂,所以可视化创建和修改就非常合适。 1、安装office2016版本&#x…...

2023 英特尔On技术创新大会直播 | 边云协同加速 AI 解决方案商业化落地
目录 前言边云协同时代背景边缘人工智能边缘挑战英特尔边云协同的创新成果最后 前言 最近观看了英特尔On技术创新大会直播,学到了挺多知识,其中对英特尔高级首席 AI 工程张宇博士讲解的边云协同加速 AI 解决方案商业化落地特别感兴趣。张宇博士讲解了英…...
Q-star计划的更多细节
继续探讨点Q*相关的话题,这个应该是目前X和Reddit上比较火的话题了,其实就是关于Q*的方法是不是让LLM变得会产生意识,会产生自己的好恶和对人类的偏见,关于Q-star的一些介绍可以看我上一篇的扫盲帖 RLAIF方法与传说中的函数Q,揭露OpenAI那不为人知的Qstar计划 (qq.com) 我…...

python3 数据分析项目案例,用python做数据分析案例
本篇文章给大家谈谈python3 数据分析项目案例,以及用python做数据分析案例,希望对各位有所帮助,不要忘了收藏本站喔。 目录 一丶可视化绘图案例 1.曲线图 2.柱形图 3.点线图 4.3D散点图 5. 绘制漏斗图 6. 绘制词云图 二丶包/模块使用示例 (1)…...
Android 12 (InputMethodManagerService) 替换默认输入法为Pinyin输入法
1.问题场景 由于系统自带的Latin输入法不支持遥控器操作,需要替换为RK的拼音输入法。 2. 替换步骤 1)将LatinIME从mk中删除,让系统编译的时候不编译该apk --- a/Android/build/make/target/product/handheld_product.mkb/Android/build/m…...

【模式识别】探秘判别奥秘:Fisher线性判别算法的解密与实战
🌈个人主页:Sarapines Programmer🔥 系列专栏:《模式之谜 | 数据奇迹解码》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 🌌1 初识模式识…...

【XML】TinyXML 详解
1、简介 优点: TinyXML 是一个简单、小型的 C XML 解析器,可以轻松集成到项目中。 TinyXML 解析 XML 文档,并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的,因此可以在开源或商业代码中…...

泛社交裂变场景下AB增量科学评估方案
在数据驱动业务的大环境下,AB实验是对策略效果进行评估的重要指南针,并广泛应用在用增/推荐/搜索/内容/商业化等多个领域,尤其是综合评估多个策略对于大盘影响的对比效果,AB增量的计算就尤为重要。 背景 现在普遍常见的泛社交裂变…...

【无标题】json报错
操作失败,JSON parse error: Cannot deserialize value of type com.alibaba.fastjson.JSONArray from String value (token JsonToken.VALUE_STRING); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize valu…...

MyBatis中延迟加载,全局和局部的开启使用与关闭
文章目录 MyBatis中延迟加载,全局和局部的开启使用与关闭1、问题提出2、延迟加载和立即加载延迟加载立即加载 3、三种对应的表关系中的加载4、打开全局延迟加载(实现一对一的延迟加载)5、实现一对多的延迟加载(将上面设置的全局延…...

MyBatis增删改查基础及其xml文件
目录 一.增删改查基础 1.增 增Insert 获取自增ID 对insert参数进行重命名 2.删 3.改 4.查 1)对MySQL查询结果进行重命名 从MySQL层面--as 从mybatis层面--Results注解 复用Results的定义 2)配置自动转换驼峰命名(推荐) 二.Mybatis xml配置…...
视觉学习(1)—— 理论
一、提问 初入视觉的几个问题: 1、视觉是怎么被控制的 2、怎么让视觉启动 3、视觉需要完成什么东西 4、视觉启动如何将完成的东西反馈给我 二、回答 1、视觉都是通过通讯协议控制,如串口、Modbus TCP等协议 2、视觉中的所有功能块都在流程中&…...

pip 常用指令 pip list 命令用法介绍
📑pip 常用命令归类整理 pip list 是一个用于列出已安装的 Python 包的命令。这个命令会显示出所有已安装的包,以及它们的版本号。 pip list 命令有以下参数 -o, --outdated:列出所有过时的包,即有新版本可用的包。-u, --uptod…...
【DP】62.不同路径
题目 法1:二维DP 必须掌握! class Solution {public int uniquePaths(int m, int n) {int[][] matrix new int[m][n];Arrays.fill(matrix[0], 1);for (int i 0; i < m; i) {matrix[i][0] 1;}for (int i 1; i < m; i) {for (int j 1; j <…...
大数据、知识图谱和强化学习的综合应用
大数据、知识图谱和强化学习各自在不同的方面都发挥了重要作用,它们分别涉及了大规模数据的处理和挖掘、基于图的数据结构和信息提取,以及基于奖励反馈的决策制定。将它们结合使用,可以构建出更加强大和智能的系统。以下是一些可能的应用场景…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...