QML类型系统

基本类型

QML默认支持一些基本类型,使用它们时不需要import语句。

下面是QML语言提供的基本类型:

类型 描述
bool true/false,以二进制存储。
double 带有小数点的数字,并以双精度IEEE浮点格式存储。
enum 命名枚举值。
int 整数,例如0、10或-20。取值范围为-2147483648至2147483647。
list QML对象的列表。
real 带小数点的数字,例如1.2或-29.8。以双精度IEEE浮点格式存储。
string 带引号的自由格式文本字符串,例如“ Hello world!”。
url 资源定位符。可以是相对路径,也可以是绝对路径。
var 通用属性类型,可以引用任何数据类型。

小贴士:enum不能单独使用,必须结合其类型一起使用。list只能存储QML对象,而不能包含任何基本类型的值。

另外,QML的QtQuick模块也提供了一些基本类型:

类型 描述
color 可以通过SVG颜色名称(如"red"或"blue")、十六进制字符串(如"#RRGGBB"或"#AARRGGBB")、Qt全局对象的方法(如Qt.rgba()或Qt.hsva())来进行引用。
date 日期值(如"2020-12-31 23:59")。
font 字体类型(如font.family)。
matrix4x4 一个4x4的矩阵类型,支持幂运算。可以使用Qt.matrix4x4()函数来组成此类型的值。
point 具有x和y属性的类型(如"0, 20")。
quaternion 具有scalar, x, y和z属性的类型(如"1, 10, 10, 1",Qt.quaternion(1, 10, 10, 1))。
rect 具有x, y, width和height属性的类型(如"50, 50, 100x100",Qt.rect(50, 50, 100, 100))。
size 具有width和height属性的类型(如"150x50",Qt.size(150, 50))。
vector2d 二维向量类型。具有x和y属性(如"1, 2",Qt.vector2d(1,2);)。
vector3d 三维向量类型。具有x、y和z属性(如"0, 1, 0",Qt.vector3d(0, 1, 0))。
vector4d 四维向量类型。具有x、y、z和w属性(如"1, 2, 3, 4",Qt.vector4d(1,2,3,4);)。

示例如下:

    property int count: 10    property double weight: 100.0    property string placeHolderText: "Hello QML"    property color backgroundColor: "#F7F7F7"    property size defaultSize: Qt.size(150, 50)    property rect defaultRect: Qt.rect(50, 50, 100, 100)    property vector2d defaultVector2d: Qt.vector2d(1,2)

对象类型

QML对象类型用于实例化QML对象。它通过指定类型名称后跟一组包含该对象属性的花括号来声明对象的类型。对象类型名称必须由字母、数字或下划线组成,并且以大写字母开头。使用它们时需要import语句。每个QML文件都隐式定义了一个QML对象类型,该类型可以在其他QML文件中重复使用。

内置对象类型

QML提供了很多内置对象类型,如QtQuick模块中的RectangleTextImageTextInput等。QtQuick.Controls模块中的ButtonLabelCheckBoxPage等。

使用QML文件实现自定义对象类型

可以通过创建QML文件实现自定义QML对象类型。该文件名称同样必须由字母、数字或下划线组成,并且以大写字母开头。如下面创建一个SquareButton.qml文件:

    // SquareButton.qml    import QtQuick 2.0

    Rectangle {        property int side: 100        width: side; height: side        color: "red"

        MouseArea {            anchors.fill: parent            onClicked: console.log("Button clicked!")        }    }

这样就可以在与SquareButton.qml文件同级目录的其他QML文件中使用SquareButton类型。

    // myapplication.qml    import QtQuick 2.0

    SquareButton {}

通过qmlscene命令执行myapplication.qml文件,可以看到运行效果如下:

点击界面后,终端会有响应日志输出。

内联组件

有时,为一个类型创建一个新文件会很不方便。在这种情况下,可以使用内联组件来完成。内联组件是在QML文件中声明一个新组件。语法如下:

    component  : BaseType {// declare properties and bindings here    }

在声明内联组件的文件中,可以直接通过名称引用该类型。

    // Images.qml    import QtQuick 2.15

    Item {        component LabeledImage: Column {            property alias source: image.source            property alias caption: text.text

            Image {                id: image                width: 50                height: 50            }            Text {                id: text                font.bold: true            }        }

        Row {            LabeledImage {                id: before                source: "before.png"                caption: "Before"            }            LabeledImage {                id: after                source: "after.png"                caption: "After"            }        }        property LabeledImage selectedImage: before    }

如果在其他文件中引用该内联组件,则必须在其前面加上组件名称。

    // LabeledImageBox.qml    import QtQuick 2.15

    Rectangle {        property alias caption: image.caption        property alias source: image.source        border.width: 2        border.color: "black"        Images.LabeledImage {            id: image        }    }

小贴士:内联组件不与声明它们的组件共享作用域,并且不可以嵌套使用。

JavaScript类型

QML可以支持JavaScript中的数据类型。如基本类型StringNumberBooleanNullUndefinedSymbol等。引用类型ObjectArrayFunctionDate等。

QML允许使用varlet语句在JavaScript表达式中声明一个变量,如下面的代码在QML中的JavaScript表达式里都是完全正常的:

    var cars = new Array();    cars[0] = "Cat";    cars[1] = "Dog";    cars[2] = "Panda";
    var sum = function (num1, num2) {        return num1 + num2    }    console.log(sum(10, 20))

小贴士:与QML不同,JavaScritp作为一种弱类型语言,它的变量是没有类型的,只有值才具有类型。变量可以随时持有任何类型的值。

qml 定义函数_QML类型系统相关推荐

  1. 结构体中定义函数指针

    结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;- }; struct 结构体标识符 *指针变量名; 变量初始化 ...

  2. 人人都能学会的python编程教程11:定义函数

    定义函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_ ...

  3. golang函数——可以为类型(包括内置数据类型)定义函数,类似类方法,同时支持多返回值...

    不可或缺的函数,在Go中定义函数的方式如下: func (p myType ) funcName ( a, b int , c string ) ( r , s int ) {return } 通过函 ...

  4. 《从问题到程序:用Python学编程和计算》——3.4 定义函数

    本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第3章,第3.4节,作者 裘宗燕,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 3. ...

  5. 要命的定义函数。。。参数组合。请认真理解!

    def test_args_kwargs(arg1, arg2, arg3):print("arg1:", arg1)print("arg2:", arg2)p ...

  6. python中调用函数时必须有实参_Python之函数(一)定义函数以及传参

    定义函数以及传参 函数的定义 def 函数名(): 函数体 例子: def func():#def关键字--定义 func函数名--和变量定义规则一样 ()必须要写格式 :声明 语句结束 s=[1,2 ...

  7. 用typedef定义函数指针类型(转)

    typedef可以用于定义函数指针类型: [语法] typedef <返回类型> (*<函数类型名>)(参数表) typedef <返回类型> (<类名> ...

  8. 使用脚本编写 Vim 编辑器,第 2 部分: 用户定义函数

    用户定义函数 Haskell 或 Scheme 程序员会告诉您,函数对于任何严肃的编程语言来说都是最重要的特性.对于 C 或 Perl 程序员,他们也会告诉您完全相同的观点. 函数为严肃的程序员提供了 ...

  9. python语言学习:python语言学习中的定义类、定义函数、封装api等详细攻略

    python语言学习:python语言学习中的定义类.定义函数.封装api等详细攻略 目录 python语言学习中的定义类 python语言学习中的定义函数 python语言学习中封装api pyth ...

最新文章

  1. Java中的10颗语法糖
  2. [设计模式] ------ 观察者模式和他的升级版发布订阅模式
  3. C++中公有继承、保护继承、私有继承
  4. linux 内核定时器精度_高精度时钟工作机制简介
  5. Postman系列之发送不同HTTP类型请求
  6. 常见语法错误:sizeof和strlen strlen获取指针指向的数组长度
  7. php 基础系列之 php快速入门
  8. 《Flutter 从0到1构建大前端应用》读后感—第6章【使用网络技术与异步编程】
  9. Mac 显示和隐藏文件
  10. 笔记本电脑系统怎么重装,笔记本重装系统
  11. Vue 3为什么要用 Proxy API 替代 DefineProperty API?
  12. Redis的使用场景及其介绍
  13. 音频信号输入itc服务器,ITC公共广播系统
  14. z-blog建立博客网站SEO优化细节教程
  15. 使用Python爬虫爬取简单网页(Python爬虫入门)
  16. teradata是MySQL吗_Teradata 数据库介绍
  17. SAP中“管理/寄售移动被无值记账”提示问题分析处理实例
  18. c语言怎么输入一个字符串跳出循环,关于字符串:键入Quit退出C程序
  19. ValueError: The number of elements in ‘fill‘ does not match the number of bands of the image (3 != 4
  20. 计算机科学与技术与光电,光电信息科学与工程考研科目有哪些?

热门文章

  1. redhat 6.5 【源码编译安装 mysql-5.5.47】
  2. (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类
  3. LINUX环境并发服务器的三种实现模型
  4. MVC3 Razor 语法检查 -(转)
  5. 《网管员世界2009超值精华本》上市啦!!!
  6. Windows mobile 下读取手机SIM卡信息
  7. Bailian4111 判断游戏胜者-Who Is the Winner【文本处理】
  8. JSK-386 分段函数【入门】
  9. UVA750 UVALive5358 8 Queens Chess Problem题解
  10. MySQL 优化之 EXPLAIN 关键字