qml学习笔记

news/2025/1/30 22:17:11/文章来源:https://www.cnblogs.com/AutumnEarly/p/18695439

目录
  • 简言
    • 1. 基础语法
    • 2. 类型
      • 2.1 enumeration
    • 3. 属性
        • 1. id属性
        • 2. 属性(Property Attributes)
        • 3. 信号(Signal Attributes)
        • 4. 信号处理程序(Signal Handler Attributes)
        • 5. 方法(Method Attributes)
        • 6. 枚举属性(Enumeration Attributes)

简言

本文的编写环境为:

版本: Qt 6.5.3

IDE: Qt creator

简单总结一些去年学习QML的总结吧,看此文章需要一定的语法基础,至少能写出hello World这种,简单划分为语法基础特性基础组件的类型常用的组件qml与C++的交互

1. 基础语法

QML是一种描述用户界面的声明式语言。它将用户界面分解成一些更小的元素,这些元素能够结合成一个组件。

QML语言描述了用户界面元素的形状和行为。用户界面能够使用JavaScript来提供修饰,或者增加更加复杂的逻辑。从这个角度来看它遵循HTML-JavaScript模式,但QML是被设计用来描述用户界面的,而不是文本文档。

从QML元素的层次结构来理解是最简单的学习方式。子元素从父元素上继承了坐标系统,它的x,y坐标总是相对应于它的父元素坐标系统。

所以学习它还需要一些JavaScript的基础,如果学过C,C++之类的语言可以到后面学习JavaScript。这里笔者就不赘述了

  • QML文件以.qml为扩展名。

  • 由一个根组件管理所属它下的所有组件

  • 示例之后,笔记会解释大部分语句的含义

  • 示例:

    import QtQuick 2.15 // 导入 QtQuick 2.15版本的模块Window { // 根组件id: rootWindow // id名 一个“文件”里组件的唯一标识符width: 400 // <属性名>: <值>height: 300color: "lightblue"Component.onCompleted: { // 组件创建完成时show(); // 正常情况下运行不需要手动调用显示窗口,会自动打开,写上是因为有些时候不会自动显示窗口}Rectangle { // rootWindow的子组件id: rectanglewidth: 100height: 100anchors.centerIn: rootWindow // 让组件保持在rootWindow的中间}
    }
  • import 导入声明一直指定的模块版本,结构为 import 模块名 [版本号],在Qt6之后版本号可写可不写,会自动导入最新的版本。

  • Window,Rectangle是由QtQuick模块提供的组件,一个组件的构成规范与常见的语言一样由字母下,划线,数字构成但组件有一点特殊需要以大写字母开头表示它是一个组件笔者喜欢纯字母构成

  • 这里以width : 400 举例,对应的width为属性名,:是绑定的含义(稍后在属性小节解释),400为属性值

2. 类型

property是注册属性的含义,笔者稍后会在属性小节解释。

类型名称 描述 示例
bool 表示布尔值(true/false)。 property bool isActive: true
date 表示日期和时间。 property date lastUpdated: new Date()
double 表示双精度浮点数。 property double value: 3.1415
int 表示整数。 property int count: 100
string 表示文本字符串。 property string greeting: "Hello, QML!"
url 表示资源路径。 Image { source: "asset:///images/logo.png" }
enumeration 表示枚举值,不能表示类型。 enum Direction { Left, Right, Up, Down }
list 表示对象列表,结构为list<类型名>. list<type> myList = [obj1, obj2, obj3]
real 表示实数(与 double 类似)。 property real coordinate: 123.456
var 表示通用类型,可以容纳任何类型的值。 property var dynamicValue: "Hello"
variant 表示变体类型,用于存储多种数据类型的值。 property variant settings: { name: "John", age: 30 }
void 表示空值类型。 property void emptyValue

2.1 enumeration

枚举类型有点特殊我给个示例,我个人不推荐使用QML注册的枚举,Qt creator支持的并不好,没有智能提示,笔者一般都是由C++注册枚举类型到QML。

使用示例:

    enum Direction { // 注册枚举Left, Right, Up, Down}// list列表property list<int> listInt: [rootWindow.Direction.Left,2,3,4]

3. 属性

属性有点特殊接下来笔者会依次解释。

1. id属性

  • 每个QML对象都有一个唯一的id属性。
  • id用于标识对象,并允许其他对象引用它。
  • id必须以小写字母或下划线开头,且不能包含特殊字符。
  • id在对象实例化后不可更改。

示例:

TextInput { id: myTextInput; text: "Hello World" }
Text { text: myTextInput.text  }

2. 属性(Property Attributes)

  • 属性用于存储对象的状态或值。

  • 属性可以是静态值或动态绑定表达式。

  • 定义属性时可使用修饰关键字:default(默认属性)、required(必填属性)、readonly(只读属性);

  • 结构: 修饰符 property 类型名 属性名 : 属性值

  • readonly修饰符,笔者常用需要组件内部维护的属性或者一个常量值,如下面的举例QCButton内部维护了一个记录的点击次数属性,我并不想组件外的对象更改它,详情如下。

  • required修饰符,需要由组件的使用者提供值,笔者这里举例为使用时需要给一个按钮指定按钮的作用。

  • 示例:

    // QCButton.qml
    import QtQuick 2.15
    import QtQuick.ControlsRectangle {id: button// 需使用QCButton者,必须指定name属性required property string name// 点击次数 readonly只能初始化一次,通过让它绑定一次其他可更改的属性达到更改它的值效果readonly property int count: area.clickedCountwidth: 100height: 100anchors.centerIn: parentText { // 文本组件id: textanchors.centerIn: parenttext: qsTr(name) + count}MouseArea {id: areaproperty int clickedCount: 0anchors.fill: parent // 填充父组件onClicked: { // 每点击一次+1clickedCount++;}}
    }
    // main.qml
    import QtQuick 2.15Window { // 根组件id: rootWindow// 默认属性 default 可写可不写因为默认就是"默认属性"default property string defaultProperty: "默认属性"// 这里就没写property string buttonText: "点击次数: "width: 400height: 300color: "lightblue"Component.onCompleted: {show();}// QCButton 自定义组件QCButton {name: rootWindow.buttonText
    //        count: 0 // 这里是错误的,因为readonly修饰的属性只能初始化一次anchors.centerIn: parent}
    }

3. 信号(Signal Attributes)

  • 信号用于在特定事件发生时通知其他对象。

  • 信号由QML类型提供,例如onTextChanged表示文本变化。

  • 示例:

    onNextColorChanged: console.log("The  next color will be: " + nextColor.toString()) 
    

4. 信号处理程序(Signal Handler Attributes)

  • 信号处理程序是响应信号的代码块,其实就是槽函数。

  • 示例:

    onNextColorChanged: console.log("The  next color will be: " + nextColor.toString()) 
    

5. 方法(Method Attributes)

  • 方法是定义在对象上的JavaScript函数。

  • 示例:

    function setInternalColor() {color = "#111111"
    }
    

6. 枚举属性(Enumeration Attributes)

  • 枚举用于定义一组常量。

  • 示例:

    enum { Red, Green, Blue }
    

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

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

相关文章

动手学大模型应用开发,第1天:学习大模型必知必会

一. 什么是LLM(大语言模型)? 1. 发展历程 语言建模的研究始于20世纪90年代,最初采用了统计学习方法,通过前面的词汇来预测下一个词汇。然而,这种方法在理解复杂语言规则方面存在一定局限性。 随后,研究人员不断尝试改进,其中在2003年,深度学习先驱Bengio在他的经典论文…

RevivedUnblockInstaller无法加载版本的一种解决方法

可以自己去Github仓库下一个 https://github.com/UnblockNeteaseMusic/server 打开RevivedUnblockInstaller目录,我这里是C:\betterncm\RevivedUnblockInstaller 把unblockneteasemusic-win-x64.exe改成UnblockNeteaseMusic-vx.xx.x.exe 我这里改成了UnblockNeteaseMusic-v0.2…

二分答案——时隔三个月的再次

暂且不提三个月未更新的主要原因(懒) 来自25年牛牛寒假营的一道寄巧题part1 仔细考虑,显然满足单调性:假设时间T恰好发生第k次碰撞,那么T之前都不能发生,T之后只会越来越多 据此,又回到了上一篇的二分答案模板,但这里仍需考虑几个问题,如何简化问题? 对于高中物理,无…

[SWPUCTF 2021 新生赛]easyupload1.0 Writeup

1.发现是一个文件上传的题目,先上传一个一句话木马hack.jpg(因为题目前端有格式控制只能上传jpg文件)2.用burp抓包后修改后缀名为.php绕过过滤3.发包后显示:4:再用蚁剑进行连接(注意url,文件在/upload中上传),发现连接成功后找到flag.php但是发现这是个假flag(个人认为…

DeepSeek-R1环境搭建推理测试

​ 引子 这两天国货之光DeepSeek-R1火爆出圈,凑个热闹。过来看看 aha moment(顿悟时刻)的神奇,OK,我们开始吧。 一、模型介绍 1月20日,中国AI公司深度求索(DeepSeek)发布的DeepSeek-R1模型,凭借其独特的强化学习(RL)训练方法,首次让AI展现出类人的“顿悟时刻”——…

Centos7解决 pip is configured with locations that require TLS/SSL 问题

​ 当在 CentOS 系统中遇到 pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available 错误时,这通常意味着 Python 的 SSL 模块没有正确安装或配置,从而导致pip无法使用安全连接来下载包。以下是解决此问题的详细步骤: …

突破自我,研发必须掌握的软技能!

0 你的问题,我知道! 光有硬技能远不够,很多研发硬技能不错,但发展有明显天花板。 影响研发职业发展走多远的核心能力有啥?技术只是打底和起步,长期职业发展看综合能力,各种软技能组合。研发常忽视或理解片面的能力: 1 沟通表达 1.1 啥是沟通表达? 不是口头“能说”,而…

小智带货助手【制作教程】增加音视频转换加贴纸等

根据用户反馈,【制作教程】在原有的功能基础之上,小智带货助手额外增加了:视频裁剪、音视频转换以及提取、音视频合并、图片转视频、音频截取、视频加贴纸等。便于直接对下载的素材进行二创修改。 截取音视频:begin为开始时间(毫秒),duration为要截取的时长(毫秒);注意单位…

昆明理工大学MBA25考研复试真题

--昆工MBA考研、管理与经济学院、125100工商管理、125602项目管理、199管理类综合能力、F009 政治、F008政治+项目管理概论

Windows server 2025 版本号 适用于 Windows Server 2025 的汇报

Windows server 2025 版本号 适用于 Windows Server 2025 的汇报 Windows Server 2025 是我们的年度频道中的最新版本。 在此页的左侧,你将找到针对此版本的 Windows Server 发布的所有更新的列表。 你还可以找到有关版本和任何已知问题的更多信息。 安装最新的更新可确保你还…

04. 用户管理

一、添加用户我们可以使用 adduser 命令 添加新用户。 sudo adduser 用户名二、更改用户密码创建完用户之后,我们还可以使用 passwd 命令 更改用户的密码。 sudo passwd 用户名三、查看用户信息我们还可以使用 id 命令 查看用户是否存在。 id 用户名如果我们想查看更多人的用户…

java中的HashSet与 == 和 equals的区别

什么是HashSet 在 Java 中,HashSet 是一个基于哈希表实现的集合类,它实现了 Set 接口 HashSet 的主要特点是:1,2 HashSet 的主要特点是 1,集合中的数据不能够重复 2,存储的数据是无序的(元素的存储顺序与插入顺序无关) 3,允许 null 值: 可以存储一个 null 元素(感觉这个不算)…