QML 语言基础

QML学习【一】QML语言基础 QML语言基础 阅读详情

    在《Qt Quick 简介》中我们提到 QML 语法和 Json 类似,请参考《Qt on Android: http下载与Json解析》查看 Json 语法。当然这里我们是期望从零开始也能学会 QML ,所以呢,你也可以直接往下看。

    版权所有 foruok,转载请注明出处:http://blog.csdn.net/foruok

对象

   QML 文件的后缀是 qml ,其实就是个文本文件。下面是 一个简单的 QML 文件:

import QtQuick 2.0
import QtQuick.Controls 1.1
import QtQuick.Dialogs 1.1
import an.qt.ImageProcessor 1.0
import QtQuick.Controls.Styles 1.1

Rectangle {
    width: 320;
    height: 480;
    color: "#121212";
    
    Image {
        source: "images/IMG_001.jpg";
        anchors.centerIn: parent;
    }
}

    这个简单的 QML 文件的开始是 import 语句,如 import QtQuick 2.0 这句,会引入 QtQuick 2.0 模块,哇,真是废话!接着废话吧。 import 和 C++ 中的 #include 类似,与 Java 中的 import 效果一样,与 JavaScript 中的……唐僧了,打住。

    Rectangle{ } 语句,定义了一个类型为 Rectangle 的对象。如果你看了《Qt on Android: http下载与Json解析》一文中有关 Json 的语法描述,应该已经知道对象要用一对花括号来描述。没错, QML 里也是这样,不过呢,花括号前要写上对象的类型。就这么简单!

    示例 QML 文档中有两个对象,一个是 Rectangle ,一个是 Image 。

    在花括号之间,是对象的属性描述(还可以有其它的,后面再说),属性是以 "property: value" 形式指定的,这点和 Json 一样。如你所见, Rectangle 对象有 width 、 color 等属性。

    属性可以分行书写,此时语句后可以不要 ";" 号,不过笔者建议 C++ 程序猿都加上 ";" ,这会避免你患上精神分裂症。当然,也可以把多个属性写在一行内,多个属性之间必须以 ";" 分割。如下所示:

Rectangle {
    width: 320; height: 480; color: "#121212";
}
    我强烈建议你不要这么干!除非有代码意外的原因,比如排版需要,比如老板觉得你代码行数太多……

表达式

     在《Qt Quick 简介》中笔者已经提到, QML 支持 JavaScript 表达式。比如你可以这样改写 Rectangle 对象的宽、高属性:

Rectangle {
    width: 23*10; 
    height: 6*80; 
    color: "#121212";
}

    我只是示意啊,你在实际项目中可别这么写,这种行为往不好听里说,有点儿脑残……当然我也可以举一个有意义的示例:

Button {
    text: "Quit";
    style: ButtonStyle {
        background: Rectangle {
            implicitWidth: 70;
            implicitHeight: 25;
            border.width: control.activeFocus ? 2 : 1;
        }
    }
}

    在这个示例中我指定了按钮风格中的背景矩形,在按钮有焦点时边框宽度为 2 没有焦点时宽度为 1 。语句 "border.width: control.activeFocus ? 2 : 1" 使用了 JavaScript 的 "?:" 三元云算法( C++ 中貌似也有……)。

    另外,慧眼如你,可能已经注意到,上面的表达式中我使用了 "control.activeFocus" ,没错,在表达式中可以引用其它对象及其属性。当你这么做的时候,待赋值的属性就和你所引用的对象的那个属性建立了关联,当被引用属性发生变化时,表达式的值会重新计算,而待赋值的属性也会变化。

    也许你心中已经有了疑问:如何引用一个对象呢?答案是:通过对象的 id 值来引用一个对象。看这里:

Rectangle {
    width: 320;
    height: 480;
    
    Button {
        id: openFile;
        text: "打开";
        anchors.left:  parent.left;
        anchors.leftMargin: 6;
        anchors.top: parent.top;
        anchors.topMargin: 6;
    }

    Button {
        id: quit;
        text: "退出";
        anchors.left: openFile.right;
        anchors.leftMargin: 4;
        anchors.bottom: openFile.bottom;
    }
}


    上面的示例中,退出按钮使用 id( openFile )引用了打开按钮。

    我的乖呀,anchors 是什么东东……先别管它,下一篇会讲到。

注释

    在 QML 中,注释与 C++ 中一样,单行以 "//" 开始,多行以 "/*" 开始以 "*/" 结束。

    注释是不被执行的,添加注释可对代码进行解释或者提高其可读性。注释同样还可用于防止代码执行,这对跟踪问题是非常有用的。

    使用注释的示例 QML :

/*
 * the root element of QML
 */
Rectangle {
    width: 320;
    height: 480;
    
    Button {
        id: quit;
        text: "退出";
        //use anchors to layout
        anchors.left: openFile.right;
        anchors.leftMargin: 4;
        anchors.bottom: openFile.bottom;
        //set z-order
        z: 1;
    }
}

属性

    其实, QML 中的属性,就是我们非常熟悉的 C++ 中的成员变量……

属性命名

    属性名的首字母一般以小写开始,如我们看烦了的 width 属性。

    如果属性名以多个单词表示,那么第二个及以后的单词,首字母大写。

属性类型

    可以在 QML 文档中使用的类型大概有三类:

  • 由 QML 语言本身提供的类型
  • 使用 QML 模块注册 C++ 类型
  • 由 QML 模块提供的类型

    我们先看 QML 语言提供的基本类型。

  基本类型

    QML 支持的基本类型包括整型、实数型、布尔、字符串、颜色、列表等等。这些基本类型有些是和 JavaScript 语言的基本类型对应的。

    还是之前的示例,修改了一下,通过注释标注了属性类型:

Rectangle {
    width: 320; //int 
    height: 480;
    
    Button {
        id: quit;
        text: "退出"; //string
        anchors.left: openFile.right;
        anchors.leftMargin: 4;
        anchors.bottom: openFile.bottom;
        z: 1.5; // real
        visible: false; //bool
    }
}

    注意, QML 中属性是有类型安全检测的,也就是说你只能指定与属性类型匹配的值,否则会报错。

    请使用 Qt 助手的索引模式,以"qml basic types " 为关键字检索,找到 QML Basic Types 页面来查看完整的类型列表和每个类型的详情。

    Qt 的 QML 模块还未 QML 引入的很多 Qt 相关的类型,如 Qt 、 QtObject 、Component 、 Connections 、 Binding 等,请使用 Qt 助手检索 "qt qml qml types" 来了解。

id 属性

    之前在介绍表达式时提到了 id 属性,这里展开描述一下。

    一个对象的 id 属性是唯一的,在同一个 QML 文件中不同对象的 id 属性的值不能重复。当给一个对象指定了 id ,就可以在其它对象或脚本中通过 id 来引用该对象。在“表达式”一节中我们已经演示了如何通过 id 来引用一个对象。

    请注意, id 属性的值,首字符必须是小写字母或下划线并且不能包含字母、数字、下划线以外的字符。

列表属性

    列表属性类似于下面这样:

Item {
    children:[
        Image{},
        Text{}
    ]
}

    列表是包含在方括号内,以逗号分隔的列表元素。看起来是不是挺熟悉?在《 Qt on Android: http下载与Json解析》中,我们举过 Json 数组的例子,再看看:

[
  "name":"zhangsan", 
  {
    "age":30,
    "phone":"13588888888",
    "other": ["xian", null, 1.0, 28]
  }
]

    其实列表和 JavaScript 的数组是类似的,其访问方式也一样:

  • length 属性提供了列表内元素的个数
  • 列表内的元素通过数组下标来访问([index])

    值得注意的是,列表内只能包含 QML 对象,不能包含任何基本类型(如整型、布尔型)。这点与 Json 是不一样的。下面是访问列表的示例:

Item {
    children:[
        Text{
            text: "textOne";
        },
        Text{
            text: "textTwo";
        }
    ]
    Component.onCompleted:{        
        for (var i = 0; i < children.length; i++)
            console.log("text of label ", i, " : ", children[i].text)
    }
}

   如果你一个列表内只有一个元素,也可以省略方括号。如下所示:

Item {
    children:Image{}
}


    不过笔者还是建议你始终使用方括号,哪怕其中只有一个元素。

    有没有什么问题?有就要说啊,闷在心里会憋坏自己的。好吧,你不说我就说了。在我们访问列表的示例中出现了一个新的内容,Component.onCompleted :{} ,这是什么东东呢?接下来我们就来讲它。

信号处理器

    信号处理器,其实等价于 Qt 中的槽。但是我们没有看到类似 C++ 中的明确定义的函数……没错,就是这样,你的的确确只看到了一对花括号!对啦,这是 JavaScript 中的代码块。其实呢,你可以理解为它是一个匿名函数。而 JavaScript 中的函数,其实具名的代码块。函数的好处是你可以在其它地方根据名字调用它,而代码块的好处是,除了定义它的地方,没人能调用它,一句话,它是私有的。代码块就是一系列语句的组合,它的作用就是使语句序列一起执行。

    让我们回头再看信号处理器,它的名字还有点儿特别,一般是 on{Signal} 这种形式。比如 Qt Quick 中的 Button 元素有一个信号 clicked() ,那么你要可能会写出这样的代码:

Rectangle {
    width: 320;
    height: 480;
    
    Button {
        id: quit;
        text: "退出";
        anchors.left: parent.left;
        anchors.leftMargin: 4;
        anchors.bottom: parent.bottom;
        anchors.bottomMargin: 4;
        onClicked: {
            Qt.quit();
        }
    }
}

    上面的 QML 代码其实已经是一个简单 QML 应用了,这个应用在窗口的左下角放了个退出按钮,当用户点击它时会触发按钮的 clicked() 信号,而我们定义了信号处理器来响应 clicked() 信号——调用 Qt.quit() 退出应用。

    你看到了,当信号是 clicked() 时,信号处理器就命名为 onClicked 。就这么简单,以 on 起始后跟信号名字(第一个字母大写)。

分组属性

    在某些情况下使用一个 '.' 符号或分组符号把相关的属性形成一个逻辑组。分组属性可写以下这样:

Text {
    font.pixelSize: 18;
    font.bold: true;
}

    也可以这样写:

Text {
    font { pixelSize: 12; bold: true; }
}

    其实呢,可以这么理解,font 属性的类型本身是一个对象,这个对象又有 pixelSize / bold / italic / underline 等等属性。对于类型为对象的属性值,可以使用 "." 操作符展开对象的每一个成员对其赋值,也可以通过分组符号(一对花括号)把要赋值的成员放在一起给它们赋值。对于后者,其形式就和对象的定义一样了,起码看起来木有区别。所以呢,又可以这么理解上面的示例: Text 对象内聚合了 font 对象。 OK ,就是聚合。

附加属性

    属性真难搞!到现在还没讲完,不但你烦了,我也快坐不住了。我保证,这是最后一个要点了,不过也是最复杂最难以理解的属性了。对于这种玩意儿,我一向的做法时,不能理解的话就接受,你就当它生来如此,存在即合理,只要学会怎么用它就 OK 了。

    在 QML 语言的语法中,有一个附加属性(attached properties)和附加信号处理器(attached signal handlers)的概念,这是附加到一个对象上的额外的属性。从本质上讲,这些属性是由附加类型(attaching type)来实现和提供的,它们可能被附加到另一种类型的对象上。附加属性与普通属性的区别在于,对象的普通属性是由对象本身或其基类(或沿继承层级向上追溯的祖先们)提供的。

   举个例子,下面的 Item 对象使用了附加属性和附加信号处理器:

import QtQuick 2.0

Item {
    width: 100; 
    height: 100;

    focus: true;
    Keys.enabled: false;
    Keys.onReturnPressed: console.log("Return key was pressed");
}

    你看, Item 对象可以访问和设置 Keys.enabled 和 Keys.onReturnPressed 的值。 enabled 是 Keys 对象的一个属性。 onReturnPressed 其实是 Keys 对象的一个信号。对于附加信号处理器,和前面讲到的普通信号处理器又有所不同。普通信号处理器,你先要知道信号名字,然后按照 on{Signal} 的语法来定义信号处理器的名字;而附加信号处理器,你只要通过附加类型名字引用它,把代码块赋值给它即可。

    最后说下 Keys 对象,它是 Qt Quick 提供的,专门供 Item 处理按键事件的对象。它定义了很多针对特定按键的信号,比如上面的 onReturnPressed ,还定义了更为普通的 onPressed 和 onReleased 信号,一般地,你可以使用这两个信号来处理按键(请对照 Qt C++ 中的 keyPressEvent 和 keyReleaseEvent 来理解)。它们有一个名字是 event 的 KeyEvent 参数,包含了按键的详细信息。如果一个按键被处理, event.accepted 应该被设置为 true 以免它被继续传递。

   下面是使用 onPressed 信号的一个示例,它检测了左方向键:

Item {
    anchors.fill: parent;
    focus: true;
    Keys.onPressed: {
        if (event.key == Qt.Key_Left) {
            console.log("move left");
            event.accepted = true;
        }
    }
}


    版权所有 foruok,转载请注明出处:http://blog.csdn.net/foruok

    好啦,关于 QML 语言的基础性介绍就到这里,相信现在你已经可以看懂简单的 QML 文档了。有的同学可能有疑问了,这节还有一些东东只见用不见讲啊,比如 Rectangle / Text / Image / Item / Button / Component / Qt 等等,抱歉,现在只能揣着糊涂装明白了,下一篇我们会讲这些东西。

QML学习笔记 QML是与HTML类似的一种标记语言。QML文件采用.qml作为文件格式后缀。作为一种标记语言(类似HTML)一个QML文档有且只有一个根元素。示例:在这个例子中使用Image元素作为根元素,这个元素的宽度、高度与"images/background.png"图像相同。QML中不限制根元素类型,在上面这段代码中我们设置了Image元素的source属性作为我们的背景图像,它也是我们的根元素。 阅读详情

相关推荐

【QML初学者文档】一问读懂QML基础开发(内附大量简单源码)

QML是Qt的一大特色,拥有强大的UI制作能力。但是想要学好QML,还需要一些细节和技巧的掌握。本篇文章将为你提供完整的QML知识体系,让你成为Qt的UI魔法师!

BenBierBa的博客 2万+

[QT编程系列-40]:QML语言简介

QML(Qt Meta-Object Language)是Qt框架中用于构建用户界面的声明性语言。它是一个轻量级的语言,用于描述界面的结构和行为,使开发人员能够快速构建跨平台的界面。QML可以与C++代码无缝集成,同时支持动态创建和组合不同的QML组件。QML使用声明式语法来描述界面。开发人员可以简洁地定义用户界面组件、布局和交互逻辑,而无需编写繁琐的代码。QML提供了一组丰富的组件,如Rectangle、Text、Image等,开发人员可以使用这些组件构建用户界面。

文火冰糖(王文兵)的博客 796

C#实战:如何用winmm.dll打造毫秒级高精度定时器(附完整代码)

本文详细介绍了在C#中利用winmm.dll实现毫秒级高精度定时器的完整方案。针对.NET内置定时器精度不足的问题,通过调用timeSetEvent等原生API,提供了超越系统时钟中断周期的精准定时能力。文章包含核心原理剖析、完整的封装类代码以及音视频处理、游戏开发等场景下的实战应用与性能调优指南。

ujm5678901的博客 688

Qt QML 第五章第一、二节:快速入门、QML 语法

QML 提供了一种称为“动态范围界定”的机制,其中稍后加载的文档会覆盖先前加载的文档中的元素 ID。元素是通过使用它们的元素名称来声明的,但是是通过使用它们的属性或创建自定义属性来定义的。对于图书内容,我们删除这个可选的版本号,正常情况下,您会自动从您选择的 Qt 工具包中选择可用的最新版本。QML: (binding)和 JavaScript = (assignment)之间的区别在于绑定是一个契约,并且在绑定的生命周期内保持为真,而 JavaScript 赋值(=)是一次性的值赋值。

申徒嘉的专栏 2151

【SWAT水文模型】SWAT-CUP参数率定与模型验证实战指南

本文提供了SWAT水文模型参数率定与模型验证的完整实战指南。详细介绍了如何使用SWAT-CUP工具,特别是SUFI-2算法,进行自动化参数校准,并阐述了模型验证的关键步骤以避免过度拟合。内容涵盖从工程搭建、核心参数选择、迭代优化到结果分析与常见问题排查的全流程,旨在帮助用户提升SWAT模型模拟的准确性与可靠性。

weixin_29072299的博客 490

解决鸿蒙/荣耀设备GMS应用调试中的“Play保护机制认证”报错

本文详细解析了在鸿蒙或荣耀设备上调试GMS应用时,遇到“Play保护机制认证”报错的根本原因与解决方案。核心在于获取设备的GMS Device ID,并通过Google官方渠道完成临时注册,从而绕过认证限制。文章提供了无需Root和ADB查询两种具体方法,并分享了授权后的故障排查与实战经验,帮助开发者高效解决问题。

weixin_29288313的博客 281

QML语言基础

学习笔记 QML语言基础 1、对象 import QtQuick 2.12 import QtQuick.Window 2.12 Window { visible: true width: 640 height: 480 title: qsTr("Hello World") } QML文件的后缀是.qml,其实文本文件 可以将对象理解为类的实例。 window{}语句,定义一个类型为window的对象。对象要用一对花括号来描述,花括号前面要写上对象的类型名字(类名

weixin_40713604的博客 640

【数字逻辑电路课程设计】多功能数码管时钟VHDL+quartus II-EP1C12F324C8+源码+付费资源

我希望需要我这篇文章的是正常学习数字逻辑课程且正在设计数码管时钟的同学。我个人不推荐直接获取源代码,因此我另有一份付费资源是完整源代码;我推荐各位去研究我代码的逻辑尝试自己书写属于自己的代码,因此我保留了注释但隐去了变量。由于时间有限,我的设计不够完美,仍有很多缺陷,我将我的展望写在后面,各位可以尝试实现。我不为难同学,作为同学我理解各位设计的辛苦,因此如果有需要,私信我提供隐去敏感信息的学生证照片可直接获取源代码。

WannaFlysyx的博客 1528

三、QML开发之qml 语言基础

属性的类型:int 、real、 double、 bool、string、color、list、font、等。介绍 QML就是用来编辑和生成Quick界面的语言,所以在开发界面之前一定要了解基础的QML语言基础知识。id :window //这几个都是对象的属性 id,后续关联信号的时候会用得到 长 宽。QML 文件就是后缀是.qml结尾的文件,下面用一个小例子来介绍具体的内容书写;点击 刚才新建 的photo.qrc文件 右击-》添加文件 -》选择本地的图片。

临渊羡鱼,不如退而结网 1919

深入剖析QWEN 2.5模型架构:从GQA到RoPE的技术实现

本文深入解析了QWEN 2.5模型架构,重点介绍了其创新的GQA(分组查询注意力)和RoPE(旋转位置编码)技术实现。通过详细代码解读,展示了这些技术如何提升模型的计算效率和长文本处理能力,适用于代码生成和数学推理等任务。文章还提供了实践部署建议和调优经验,帮助开发者更好地应用这一先进模型。

weixin_42548816的博客 383

Euro-NCAP-HWA测试流程中文版V1.1(2023发布)

在本协议中,使用了以下术语:Vehicle undertest (VUT) – 指根据本规程测试的车辆,车上有碰撞前的碰撞缓解或避免系统Global VehicleTarget (GVT) – 指本协议中使用的车辆目标,其定义见TB025—Euro-NCAP全球车辆目标规范v1.0辅助其他车辆(SOV)--指最新的 AEB VRU 测试规程中定义的 "大型障碍车辆"(而非机器人控制的平台),用于本规程中的 "切出 "测试。Time To Collision (TTC) – 指在VUT碰撞GVT之前的剩余时间

小明师兄的博客 591

qml语言基础

如上图,新建一个空的Qt Quick Application,运行就是一个空的窗口文件 import语句 导入模块,类似于c++中的include QtQuick 2.9:此模块为创建图形用户界面提供了最基本的类型 QtQuick.Window模块:window类型可以为Qt Quick场景创建一个顶级窗口 QML对象 对象类型被实例化以后,就叫做该对象类型的对象 如Window,在代码中现在就是一个对象,以大写字母开头,后面跟一对大括号,在括号中包含对象的属性 QML元素 如以下的控件...

qq_33373173的博客 277

STM32 使用SYN6288语音模块

本篇文章带大家学习一下SYN6288语音模块,这个模块可以用于车载设备,语音电子书等众多产品当中,而且这个模块支持多种编码格式,GB2312,GBK等字符编码格式。SYN6288语音合成模块是一种语音合成设备,其可实现文字转语音功能,将输入的文字信息通过内部的处理和合成,输出相对应的语音信息。SYN6288模块具有语音合成质量高、输出音质好、使用方便等特点,因此广泛应用于语音播报、语音提示、语音识别、智能家居、智能家电、安防监控等领域。支持多语言:包括中文、英文、日文、韩文等多种语言。

m0_49476241的博客 2万+

qml语言基础(一)

qml文件的后缀是。qml 1.对象: 即c++中的类的实例 2表达式:.即c++中的一条语句例如 :width:320; 一个示例: Button{ text:"Quit"; style:ButtonStyle{ background:Rectangle{ implicitWidth: 70; implicitHeigh...

lvmengzou的专栏 361

一文吃透:从零到一开发一套 ABAP RAP 应用的完整路径

ABAP RAP开发实战摘要 本文系统介绍了ABAP RESTful Application Programming Model (RAP)在企业级应用开发中的实施路径。文章以出差申请业务场景为例,详细拆解了RAP开发的六步主线流程: 数据库表设计:规范主键、审计字段设计 CDS数据建模:通过视图定义业务对象实体及关联 行为定义与实现:使用BDEF声明事务规则,Behavior Pool类实现业务逻辑 业务对象投影:裁剪服务接口视图 服务定义与绑定:按OData协议暴露服务 UI集成测试:支持Fiori E

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 493

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

QML 语言基础----(Qt Quick 教程二)

对象 QML 文件的后缀是 qml ,其实就是个文本文件。下面是 一个简单的 QML 文件: import QtQuick 2.0 import QtQuick.Controls 1.1 import QtQuick.Dialogs 1.1 import an.qt.ImageProcessor 1.0 import QtQuick.Controls.Styles 1.1 Rect...

望那伊人的博客 1104

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Qt Quick 简介
下一篇: Qt Quick 之 Hello World 图文详解
foruok
foruok 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄21年 2万+粉丝 581原创
评论 17
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

foruok

你可以选择打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值