【Qt之Quick模块】3. QML类型

概述

Qt QML模块为使用QML语言开发应用程序和库提供了一个框架。它定义并实现了语言和引擎基础结构,并提供了一个API,使应用程序开发人员能够使用自定义类型扩展QML语言,并将QML代码与JavaScript和c++集成在一起。Qt QML模块提供了QML API和c++ API。
请注意,虽然Qt QML模块为QML应用程序提供了语言和基础结构,但Qt Quick模块提供了许多可视化组件、模型-视图支持、动画框架以及用于构建用户界面的更多内容。
上面这句话是啥意思呢?QML和Quick就类似于C++与C++标准库的关系。没有C++标准库,C++也能进行开发把,但有了标准库,就如虎添翼,不用自己造轮子了。

QML文件

生成.qml文件后,类似于下方代码:

import QtQuick 2.2
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
}

以上代码解释如下:

  1. import QtQuick 2.2:
  • 这行代码导入了 QtQuick 模块的版本 2.2。QtQuick 模块包含了创建动画、图形和界面元素所需的所有功能。
  1. import QtQuick.Window 2.2:
  • 这行代码导入了 QtQuick.Window 模块的版本 2.2。QtQuick.Window 模块提供了创建窗口和管理窗口状态的功能。
  1. Window {:
  • 这行代码开始定义一个窗口对象。在 Qt Quick 中,你可以使用 Window 元素来创建一个窗口,并设置其属性。
  1. visible: true:
  • 这行代码设置窗口的可见性为 true,这意味着当应用程序启动时,窗口将自动显示。
  1. width: 640:
  • 这行代码设置窗口的宽度为 640 像素。
  1. height: 480:
  • 这行代码设置窗口的高度为 480 像素。
  1. title: qsTr("Hello World"):
  • 这行代码设置窗口的标题为 “Hello World”。qsTr 是一个函数,用于国际化和本地化字符串。在此情况下,它确保标题 “Hello World” 能够根据用户的语言环境正确地显示。
  1. }:
  • 这行代码结束了 Window 对象的定义。

但问题来了,你进行import QtQuick xx导入的时候,你怎么就知道当前Qt版本对应的QtQuick模块是哪个版本呢?
大概就是Qt 4版本对应的是1.x, Qt 5版本对应的是2.x;如果运行报如下错:

 module "QtQuick" version 2.7 is not installed

可以手动改,比如将2.7改为2.6,如果2.6不行就改为2.5;Qt 6版本后好像不用输入Quick版本号了,编译的时候,会自动获取。
以下是一个参考,Qt库版本对应的Qml和Quick模块版本。
在这里插入图片描述

QML类型系统

在QML文档中对象层次结构的定义中可能使用的类型可以来自各种来源。它们可能是:

  • 由QML语言原生提供
  • 通过QML模块通过c++注册
  • 由QML模块作为QML文档提供

此外,应用程序开发人员可以通过直接注册c++类型,或者通过在QML文档中定义可重用的组件(然后可以导入)来提供自己的类型。
无论类型定义来自何处,引擎都将为这些类型的属性和实例强制类型安全。

QML基本类型

QML语言内置了对各种基本类型的支持,包括整数、双精度浮点数、字符串和布尔值。对象可以具有这些类型的属性,这些类型的值可以作为参数传递给对象的方法。
QML支持许多基本类型。

QML语言提供的基本类型

QML语言原生支持的基本类型如下:
在这里插入图片描述

QML模块提供的基本类型

QML模块可以用更基本的类型扩展QML语言。例如,QtQuick模块提供的基本类型如下:
在这里插入图片描述
Qt全局对象为操作基本类型的值提供了有用的函数。
目前只有Qt提供的QML模块可以提供自己的基本类型,但这可能会在Qt QML的未来版本中改变。为了使用特定QML模块提供的类型,客户端必须在其QML文档中导入该模块。

基本类型是指引用简单值的类型,例如int或string。这与QML对象类型形成对比,后者引用具有属性、信号、方法等的对象。
与对象类型不同,基本类型不能用于声明QML对象:例如,不能声明int{}对象或size{}对象。
基本类型可以用来指:

  • 单个值(例如,int指单个数字,var指单个项目列表)
  • 一个包含一组简单的属性值对的值(例如,size指的是一个带有width和height属性的值)
单个值示例

int类型指的是整数,例如0、10或-20。
可能的int值范围从-2000000000到2000000000左右,尽管大多数类型只接受一个缩小的范围。
例子:

  Item { width: 100; height: 200 }

这种基本类型由QML语言提供。

var类型示例

泛型属性类型。
var类型是一个泛型属性类型,可以引用任何数据类型。
它相当于一个普通的JavaScript变量。例如,var属性可以存储数字、字符串、对象、数组和函数:

  Item {
      property var aNumber: 100
      property var aBool: false
      property var aString: "Hello world!"
      property var anotherString: String("#FF008800")
      property var aColor: Qt.rgba(0.2, 0.3, 0.4, 0.5)
      property var aRect: Qt.rect(10, 10, 10, 10)
      property var aPoint: Qt.point(10, 10)
      property var aSize: Qt.size(10, 10)
      property var aVector3d: Qt.vector3d(100, 100, 100)
      property var anArray: [1, 2, 3, "four", "five", (function() { return "six"; })]
      property var anObject: { "foo": 10, "bar": 20 }
      property var aFunction: (function() { return "one"; })
  }

或者:

    Item {
        property var wheels: 4

        Text {
            text: "The car has " + parent.wheels + " wheels";
        }
    }

在这里插入图片描述

size类型

具有宽度和高度属性的值
size类型指的是一个具有宽度和高度属性的值。
例如,要读取Image::sourceSize size-type属性的宽度和高度值:

  Column {
      Image { id: image; source: "logo.png" }
      Text { text: image.sourceSize.width + "," + image.sourceSize.height }
  }

要创建一个size值,将其指定为"width x height"字符串:

  Image { sourceSize: "150x50" }

或者使用Qt.size()方法:

  Image { sourceSize: Qt.size(150, 50) }

当与c++集成时,请注意,从c++传入QML的任何QSize或QSizeF值都会自动转换为大小值,反之亦然。当size值传递给c++时,它会自动转换为QSizeF值。

引擎支持的类型

引擎默认支持一些基本类型,不需要使用import语句,而其他基本类型则需要客户端导入提供它们的模块。下面列出的所有基本类型都可以用作QML文档中的属性类型,但有以下例外:

  • list必须与QML对象类型一起使用
  • 枚举不能直接使用,因为枚举必须由已注册的QML对象类型定义

如list类型用法:

import QtQuick 2.2
import QtQuick.Window 2.2

Rectangle {
    ListModel {
        id: myModel
        ListElement {
            name: "John"
            age: 30
        }
        ListElement {
            name: "Jane"
            age: 25
        }
    }

    ListView {
        id: listView
        anchors.fill: parent
        model: myModel
        delegate: Item {
            Text {
                text: name + " " + age
            }
            width: 100  // 设置文本宽度
            height: 50  // 设置文本高度
        }
        // spacing: 20  // 增加列表项之间的间距
    }
}

以上示例代码作用:

  • 首先该代码包括一个Rectangle元素和一个ListView元素。Rectangle是一个容器,可以包含其他的QML元素。ListView是一个用于显示列表数据的滚动区域
  • 定义了一个ListModel,它包含了两个ListElement对象。每个ListElement对象都有两个属性:nameage。这些属性用于存储每个列表项的数据
  • ListView中使用了这个ListModel作为其模型。这意味着ListView会使用ListModel中的数据来创建列表项
  • 定义了ListViewdelegate属性。delegate是用于定义每个列表项的外观和行为的元素。在例子中,我们使用了一个Item元素作为代理,它包含一个Text元素。Text元素用于显示每个列表项的数据
  • 设置了Text元素的text属性,它将显示列表项的nameage属性
  • 设置了widthheight属性来控制文本的显示区域。这些属性确定了文本的宽度和高度,以防止文本溢出其区域并与其他文本重叠
  • ListView添加了spacing属性,它用于增加列表项之间的间距。这可以帮助避免文本重叠,因为每个列表项都有一些空间来正确地显示其内容。

显示如下:
在这里插入图片描述

基本类型的属性更改行为

一些基本类型有属性:例如,字体类型有pixelSize、family和bold属性。与对象类型的属性不同,基本类型的属性不提供自己的属性更改信号。只能为基本类型属性本身创建属性更改信号处理程序:

  Text {
      // invalid!
      onFont.pixelSizeChanged: doSomething()

      // also invalid!
      font {
          onPixelSizeChanged: doSomething()
      }

      // but this is ok
      onFontChanged: doSomething()
  }

但是,请注意,每当基本类型的任何属性发生更改时,以及当属性本身发生更改时,都会发出基本类型的属性更改信号。以下面的代码为例:

  Text {
      onFontChanged: console.log("font changed")

      Text { id: otherText }

      focus: true

      // changing any of the font attributes, or reassigning the property
      // to a different font value, will invoke the onFontChanged handler
      Keys.onDigit1Pressed: font.pixelSize += 1
      Keys.onDigit2Pressed: font.b = !font.b
      Keys.onDigit3Pressed: font = otherText.font
  }

相反,对象类型的属性会发出自己的属性更改信号,对象类型属性的属性更改信号处理程序只有在将属性重新分配给不同的对象值时才会调用。

JavaScript类型

JavaScript对象和数组由QML引擎支持。任何标准的JavaScript类型都可以使用泛型var类型创建和存储。
例如,可以使用标准的Date和Array类型,如下所示:

  import QtQuick 2.0

  Item {
      property var theArray: []
      property var theDate: new Date()

      Component.onCompleted: {
          for (var i = 0; i < 10; i++)
              theArray.push("Item " + i)
          console.log("There are", theArray.length, "items in the array")
          console.log("The time is", theDate.toUTCString())
      }
  }

在这里插入图片描述

QML Object类型

QML对象类型是QML对象可以实例化的类型。QML对象类型派生自QtObject,并由QML模块提供。应用程序可以导入这些模块来使用它们提供的对象类型。QtQuick模块提供了在QML中创建用户界面所需的最常见对象类型。
最后,每个QML文档隐式地定义一个QML对象类型,该对象类型可以在其他QML文档中重用。
QML Object类型如下:
在这里插入图片描述

以上是QML类型的一些介绍。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python用什么软件编写程序,python编写的软件有哪些

大家好&#xff0c;本文将围绕python用什么软件编写程序展开说明&#xff0c;python编写的软件有哪些是一个很多人都想弄明白的事情&#xff0c;想搞清楚用什么软件编写python需要先了解以下几个事情。 大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python可以用什么…

一文3000字从0到1使用JMeter进行压力测试!

一、压力测试 压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。压测都是为了系统在线上的处理能力和稳定性维持在一个标准范围内&#xff0c;做到心中有数。 使用压力测试&#xff0c;我们有希望找到很多种用其他测试方法更难发现的错误。有两种错…

【MATLAB】史上最全的25种信号分解算法全家桶

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 【MATLAB】EMD 信号分解算法 EMD 是一种信号分解方法&#xff0c;它将一个信号分解成有限个本质模态函数 (EMD) 的和&#xff0c;每个 EMD 都是具有局部特征的振动模式。EMD 分解的主要步骤如下&#xff1a; 将信号的…

软件分享--图片置顶工具

一个好的程序应该只做一件事情&#xff0c;并且将这件事情做好。 使用许多小工具的集合要比使用一个什么都做但什么都做不好的工具要好。 linux系统强大&#xff0c;组成它的是dd、sed、grep、awk、tar等各种命令工具的集合。 如果你能够合理使用各种小工具。效率会比使用任何…

【pentaho】kettle读取Hive表不支持bigint和timstamp类型解决。

一、bigint类型 报错: Unable to get value BigNumber(16) from database resultset显示kettle认为此应该是decimal类型(kettle中是TYPE_BIGNUMBER或称BigNumber)&#xff0c;但实际hive数据库中是big类型。 修改kettle源码解决&#xff1a; kettle中java.sql.Types到kettle…

12.21

一、注意事项 1.CtrlShiftT用于从jar中查找类&#xff0c;这个eclipse键盘快捷键可以帮助快速找到类 2.更新upm和rest遇到重复解决方法 把upm文件里面多出来的三行代码删掉&#xff0c;右击upm文件&#xff0c;点击小组&#xff0c;点击标记为已解决&#xff0c;点击OK&#x…

springboot使用Validated实现参数校验

做为后端开发人员&#xff0c;一定有前端传的数据是可能会出错的警惕性&#xff0c;否则程序就可能会出错&#xff0c;比如常遇到的空指针异常&#xff0c;所以为了程序运行的健壮性&#xff0c;我们必须对每一个参数进行合法校验&#xff0c;就能避免很多不必要的错误&#xf…

MyBatis Plus使用遇到的问题

如果想使用Mapper的xxxById()方法&#xff0c;实体类的主键上面必须加上TableId注解&#xff0c;如果不加&#xff0c;会报错 2023-12-21 22:48:33.526 WARN 11212 --- [ main] c.b.m.core.injector.DefaultSqlInjector : class com.example.mybatisplusdemo.dom…

Java最全面试题专题---5、Spring MVC

概述 什么是Spring MVC&#xff1f;简单介绍下你对Spring MVC的理解&#xff1f; Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把模型-视图-控制器分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清…

牛客小白月赛78(C: 第K小表示数)

C-第K小表示数_牛客小白月赛78 (nowcoder.com) 问题&#xff1a; 分析: k的极限是1e6,因此要几乎O(n)的时间复杂度给求出来&#xff0c;还需要每插入一个元素我都要去排序&#xff0c;这个时候set就派上用场了&#xff0c;自带排序和去重,集合里面最小和第二小的一定是min(a…

新闻软文怎么写?才能让用户看得下去

在企业软文推广的过程中&#xff0c;除了常规的行业型软文与用户型软文外&#xff0c;新闻式软文也是企业宣传的常用方式。然而新闻稿虽然可信度强&#xff0c;但是故事性弱用户不一定看得下去&#xff0c;如果无法吸引用户阅读的话&#xff0c;那这篇新闻稿就起不到宣传作用&a…

pip 离线安装:利用pypi网站进行模块 库的离线安装

离线安装是一种很好的方法&#xff0c;在网络不佳、库版本不明确、复杂库本地编译安装报错时&#xff0c;通过whl文件的下载安装&#xff0c;可以很高效的解决问题。 pypi的网站&#xff1a;https://pypi.org/ 这个网站包含各种你 pip install xxx 的库&#xff0c;离线安装可…

【Week-P2】CNN彩色图片分类-CIFAR10数据集

文章目录 一、环境配置二、准备数据三、搭建网络结构四、开始训练五、查看训练结果六、总结3.1 ⭐ torch.nn.Conv2d()详解3.2 ⭐ torch.nn.Linear()详解3.3 ⭐torch.nn.MaxPool2d()详解3.4 ⭐ 关于卷积层、池化层的计算4.2.1 optimizer.zero_grad()说明4.2.2 loss.backward()说…

【git学习笔记 01】打标签

文章目录 一、声明二、对标签的基本认知什么是标签&#xff1f;为什么要打标签&#xff1f;如何生成类似github中readme的图标 三、标签相关命令四、示例操作 一、声明 本帖持续更新中如有纰漏&#xff0c;望批评指正&#xff01;参考视频链接&#xff0c;非常感谢原作者&…

法线贴图实现衣服上皱褶特效

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 法线贴图在3D建模中扮演着重要的角色&#xff0c;它通过模拟表面的微…

Vue3视图渲染技术(2)

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

vue中的侦听器和组件之间的通信

目录 一、侦听器 监听基本数据类型&#xff1a; 监听引用数据类型&#xff1a; 计算属性和watch区别&#xff1f; 二、组件通信/传值方式 1.父子组件传值 父组件给子组件传值&#xff1a; &#xff08;1&#xff09;props &#xff08;2&#xff09;provide inject &…

k8s中Helm工具实践

k8s中Helm工具实践 1&#xff09;安装redis-cluster 先搭建一个NFS的SC&#xff08;只需要SC&#xff0c;不需要pvc&#xff09;&#xff0c;具体步骤此文档不再提供&#xff0c;请参考前面相关章节。 下载redis-cluster的chart包 helm pull bitnami/redis-cluster --untar…

Java可变参数(学习推荐版,通俗易懂)

定义 可变参数本质还是一个数组 示例代码 注意事项 1.形参列表中&#xff0c;可变参数只能有一个 2.可变参数必须放在形参列表的最后面 注意是最后面。 name也可以为int类型

做题总结 202. 快乐数

202. 快乐数 思路分析代码实现-Java代码优化 思路分析 本人没有思路 在看题的时候&#xff0c;我不知道如果 不是快乐数怎么处理。我感觉是会死循环&#xff0c;一直加下去。没有考虑到会有重复数字出现。 为什么不会进行死循环&#xff1f;&#xff08;为什么会有重复数字出…
最新文章