【QML之·基础语法概述】

系列文章目录


文章目录

  • 前言
  • 一、QML基础语法
  • 二、属性
  • 三、脚本
  • 四、核心元素类型
    • 4.1 元素可以分为视觉元素和非视觉元素。
    • 4.2 Item
      • 4.2.1 几何属性(Geometry):
      • 4.2.2 布局处理:
      • 4.2.3 键处理:
      • 4.2.4 变换
      • 4.2.5 视觉
      • 4.2.6 状态定义
    • 4.3 Rectangle
      • 4.3.1 颜色
    • 4.4 Text
    • 4.5 Image
    • 4.6 MouseArea
  • 五、实例演示
  • 总结


前言

  • QML是一种用于描述对象如何相互关联的声明式语言。
  • QtQuick是一个基于QML的框架。

一、QML基础语法

  • import语句导入一个模块。qt6 可以不写版本号,自动加载最高版本的模块。
  • 对于单行注释,可以使用//,对于多行注释,可以通过/**/进行注释。就像在C/C++和JavaScript中一样
  • 每个QML文件都需要有一个唯一的根元素,就像HTML一样
  • 元素声明形式为:type{ }
  • 元素可以有属性,形式为:name:value
  • QML文档中的任意元素可以通过使用其id(不带引号的标识符)进行访问
  • 元素可以嵌套,这意味着父元素可以有千元去子元素可以使用parent关键字访问父元素

二、属性

  • 属性是一个简单的键值对,例如:width:100; text: ‘Greetings’ ; color: ‘#FF0000’
  • 属性具有类型,并且可以具有初始值。
  1. id是用于引用QML文件(在QML中称为"document”)中的元素。id在文档中必须是唯一的,不能重置为其他值。(类似于C++的引用。)
  2. 属性可以设置值,具体取决于其类型。如果没有为属性指定值,将使用默认初始值。
  3. 属性可以依赖于一个或多个其他属性。这称为绑定
  4. 可以使用property限定符向元素添加新属性,后跟类型、名称和可选的初始值( property<类型><名称>:<值>) 。
  5. 声明属性的另一种重要方式是使用别名关键字(property alias≤名称>:<引用>)。
  6. 基于int的值将自动转换为字符串类型。每次times属性更改时都会更新文本。
  7. 编写grouped property的另一种方法是font{family:“Ubuntu”; pixelSize:24}。
  8. 快速切换焦点。
  9. 可以为属性提供处理程序。属性更改后被调用。

三、脚本

  • QML和JavaScript(也称为ECMAScript)是好朋友。
  1. 也可以使用箭头函数((text)=> {})。
  2. 当用户按下了键盘上的空格键,调用JavaScript函数increment() 。
  3. 以函数name(){ …}的形式定义JavaScript函数,它增加了计数器。每次SpacePress递增时,绑定属性也将更新。

四、核心元素类型

4.1 元素可以分为视觉元素和非视觉元素。

  • 视觉元素(如Rectangle)具有几何形状。
  • 非视觉元素(Timer)提供一般功能,通常用于控制视觉元素。

4.2 Item

ltem是所有视觉元素的基础元素,因此所有其他视觉元素都从ltem继承。 它本身
并不绘制任何东西,但定义了所有视觉元素的共同属性:

4.2.1 几何属性(Geometry):

  • x、y: 用于定义元素展开的左上角位置
  • z: 用于定义堆叠顺序
  • width、height: 用于表示范围

4.2.2 布局处理:

  • anchors:(左、右、上、下、垂直和水平中心)相对于其他元素进行定位。
    • 可选项margins

4.2.3 键处理:

  • KeyKeyNavigation属性用于控制键处理
  • focus属性启用键处理

4.2.4 变换

  • scalerotate变换以及x、y、z变换的通用transform属性列表,以及transformOrigin。

4.2.5 视觉

  • opacity用于控制透明度,visible用于显示/隐藏元素,clip用于限制对元素边界的绘制操作,smooth用于增强渲染质量。

4.2.6 状态定义

  • states用于动画化状态更改。
    • 包含所有支持的状态列表,当前state属性和transitions 列表属性,

4.3 Rectangle

Rectangle扩展了Item,为其添加填充颜色。此外,还支持border.colorborder.width。要创建圆角矩形,可以使用radius属性。

4.3.1 颜色

  • gradient用于填充渐变颜色
    • position标记y轴上的位置(o=顶部,1=底部)

4.4 Text

  • 要显示文本,可以使用Text元素。它最显著的属性是字符串类型的text属性。元素根据给定的文本和使用的字体(例如font.family、font.pixelSize等)计算其初始宽度和高度。要更改文本的颜色,只需使用color属性。
  • 可以使用horizontalAlignmentverticalAlignment属性对齐文本。使用stylestyleColor允许以轮廓、凸起和凹陷模式渲染文本。
  • elide属性允许将省略符位置设置为文本的左侧、右侧或中间。
  • 例如:A very … long text
  • 如果不希望省略符模式的"…"出现,但仍希望看到全文,可以使用wrapMode属性包装文本(仅在显式的设置了宽度时有效)

4.5 Image

lmage元素能够以各种格式(例如PNG、JPG、GIF、BMP、WEBP)显示图像。有关支持的图像格式的完整列表,请参阅Qt文档。除了提供图像URL的source属性外,它还包含一个控制大小调整行为的fillMode

说明
lmage.Stretch默认值。缩放图像以适合项目
Image.PreserveAspectFit图像均匀缩放以适应而不裁剪
Image.PreserveAspectCrop图像均匀缩放以填充,必要时进行裁剪
Image.Tile水平和垂直复制图像
lmage.TileVertically图像水平拉伸并垂直平铺
lmage.TileHorizontally图像被垂直拉伸并水平平铺Image.Pad:图像未转换
  • 使用PreserveApectCrop的图像元素还应启用clip,以避免在图像边界之外渲染图像数据。
  • 可以在C++中使用QQuicklmageProviger创建自己的图像提供程序。动态创建图像,并利用线程加载图像。

4.6 MouseArea

MouseArea这是一个矩形的不可见项,可以在其中捕获鼠标事件。

五、实例演示

示例1:

import QtQuick 2.12
import QtQuick.Window 2.12Rectangle {id: rootwidth: 640; height: 480color: "#4A4A4A"Image {id: imagex: (/*root.*/parent.width - width) / 2;y: (root.height - height) / 2source: "../00_chapter1-pinwheel/images/pinwheel.png"}Text {
//        id: nametext: qsTr("大风车傻乎乎的转!")/*x: (root.width - width) / 2;*/y: image.y + image.height + 20horizontalAlignment: Text.AlignHCenterwidth: root.widthcolor: 'white'}
}

运行结果:
在这里插入图片描述
示例2:

import QtQuick 2.9
import QtQuick.Window 2.3Rectangle{id: rootwidth: 800;height: 800Text {// (1) identifierid: lable1// (2) set x- and y-positonx: 20;y: 20// (3) bind height to 2 * widthheight: 2 * widthRectangle {anchors.fill: parentcolor: 'yellow'z: parent.z - 1}// (4) custom propertyproperty int times: 24// (5) property aliasproperty alias anotherTimes: lable1.times// (6) set text appended by valuetext: "lable1 " + anotherTimes// (7) font is a grouped properttfont.family: "Ubuntu"font.pixelSize: 80
//        font {family: "Ubuntu";pixelSize: 24}// (8) KeyNavigation is an attached propertyKeyNavigation.tab: lable2// (9) signal handler for property changesonHeightChanged: console.log('height:',height)// (10) focus is need to receive key eventsfocus: true// (11) change color based on focus valuecolor: focus ? "green":"red"}Text {id: lable2x: lable1.x;y: lable1.y +300font{pixelSize: 80}text: qsTr("lable2")focus: !lable1.focusKeyNavigation.tab: lable1color: focus ? "green":"red"}
}

运行结果:
在这里插入图片描述
示例3:

import QtQuick 2.9
import QtQuick.Window 2.3Rectangle{id: rootwidth: 800;height: 800Text {id: lable1color: whitex: 200;y: 200property int spacePresses: 0text: "lable1 " + spacePresses + " times"font.family: "Ubuntu"font.pixelSize: 50onTextChanged: function(text){ console.log("text changed to:",text)}
//        onTextChanged: (text) =>{console.log("text changed to:",text)}focus: trueKeys.onSpacePressed: {increment()}Keys.onEscapePressed: {lable1.text = ''}function increment(){spacePresses += 1}KeyNavigation.tab: lable1}
}

运行结果:
在这里插入图片描述
示例4:

import QtQuick 2.9
import QtQuick.Window 2.3Window {visible: truewidth: 640height: 480title: qsTr("Rect")Rectangle {id: rect1x: 20;y: 20width: 100; height: 100color: 'lightsteelblue'}Rectangle {id: rect2x: 140;y: 20width: 100; height: 100border.color: 'lightsteelblue'border.width: 4radius: 20}Rectangle {id: rect3x: 260;y: 20width: 100; height: 100gradient: Gradient {
//            GradientStop {position: 0.0;color: 'lightsteelblue'}
//            GradientStop {position: 1.0;color: 'slategray'}GradientStop {position: 0.0;color: 'green'}GradientStop {position: 1.0;color: 'red'}}border.color: 'lightsteelblue'border.width: 4radius: 20}Rectangle {id: rect4x: 20;y: 140width: 100; height: 100//可以使用JavaScript创建随机颜色color: Qt.rgba(Math.random(),Math.random(),Math.random(),1)}
} 

运行结果:
在这里插入图片描述

示例5:

Window {visible: truewidth: 640height: 780title: qsTr("Hello World")Text {id: text1text: "明天你好!"color: "#303030"font.family: "Ubuntu"font.pixelSize: 30}Text {y: text1.height+50width: 180elide: Text.ElideMiddle //文字缩略显示属性设置text: "今天你过的好吗???????????"font.family: "Ubuntu"font.pixelSize: 80style: Text.SunkenstyleColor: '#000000'color: 'white'
//        wrapMode: Text.WordWrap //文字超过设置宽度换行(符号不属于文字范畴)wrapMode: Text.WrapAtWordBoundaryOrAnywhere //符号也会换行}
}

运行结果:
在这里插入图片描述

在这里插入图片描述
示例6:

import QtQuick 2.9
import QtQuick.Window 2.3Window {visible: truewidth: 800height: 600title: qsTr("Image")Image {id: image1width: 300; height: 300source: "./image/triangle.png"}Image {
//        id: image1x: image1.x + image1.width + 20width: image1.width / 2; height: 300source: "./image/triangle.png"
//        fillMode: Image.Stretch             //默认值。缩放图像以适合项目
//        fillMode: Image.PreserveAspectCrop  //图像均匀缩放以填充,必要时进行裁剪
//        clip: truefillMode: Image.PreserveAspectFit     //图像均匀缩放以适应而不裁剪(长宽哪个小,以哪个为基准)}
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
示例7:

import QtQuick 2.9
import QtQuick.Window 2.3Window {visible: truewidth: 800height: 700title: qsTr("MouseArea")Rectangle {id: rect1x: 10;y: 10width: 280;height: 280color: "lightsteelblue"MouseArea{width: parent.width; height: parent.heightonClicked: rect2.visible = !rect2.visible}}Rectangle {id: rect2x: 300;y: 10width: 280;height: 280border.color: "lightsteelblue"border.width: 5}
}

运行结果:
在这里插入图片描述


总结

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

人话学Python-基础篇-字符串

一&#xff1a;字符串的定义 在Python中使用引号来定义。不论是单引号还是双引号。 str1 Hello World str2 "Hello World" 二&#xff1a;字符串的访问 如果我们要取出字符串中单独的字符&#xff0c;需要使用方括号来表示取得的位置。如果要取出字符串的子串&…

电脑引导坏了怎么修复?电脑引导坏了全自动修复教程

电脑怎么修复引导?我们知道目前电脑有两种引导模式legacy和uefi&#xff0c;所以会出现legacy和uefi引导修复的问题&#xff0c;随着uefi的流行&#xff0c;越来越多的小伙伴经常遇到电脑引导丢失的问题&#xff0c;也不知道怎么修复&#xff0c;以前的一些修复工具都只能修复…

20240710 每日AI必读资讯

&#x1f916;微软&#xff1a;不会像 OpenAI 一样阻止中国访问 AI 模型 - OpenAI 将于周二&#xff08;7 月 9 日&#xff09;开始阻止中国用户访问其 API。 - 微软发言人表示&#xff1a;Azure OpenAI API服务在中国的提供方式没有变化。 - 公司仍然通过部署在中国以外地区…

递归、搜索与回溯算法 2024.7.4-24.7.9

专题介绍&#xff1a; 一、递归 1、汉诺塔问题 class Solution {public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {int n A.size();move(n,A,B,C);// 将A柱上的n个盘子通过借助B盘子全部挪到C柱子上}void move(int m,List<Integ…

7.9实验室总结 SceneBuilder的使用方法+使用javafx等

由于下错了东西&#xff0c;所以一直运行不出来&#xff0c;今天一直在配置环境&#xff0c;配置好了才学&#xff0c;所以没学多少&#xff0c;看了网课学习了SceneBuilder的使用方法还有了解了javafx是怎么写项目的&#xff0c;&#xff0c; 学习了怎么跳转页面&#xff1a;…

如何在Vue中实现拖拽功能?

Vue.js是一款流行的JavaScript框架&#xff0c;用于构建用户界面。其中一个常见的需求是在Vue中实现拖拽功能&#xff0c;让用户可以通过拖拽元素来进行交互。今天&#xff0c;我们就来学习如何在Vue中实现这一功能。 首先&#xff0c;我们需要明白拖拽功能的基本原理&#xf…

javaweb零碎知识3

// 假设您已经导入了 axios import axios from axios;// 获取表单元素 const form document.getElementById(myForm);// 为表单添加 submit 事件监听器 form.addEventListener(submit, function(e) {// 阻止表单的默认提交行为e.preventDefault();// 创建 FormData 对象并从表…

OJhelper一款帮助你获取各大oj信息的软件

项目地址 应用功能 目前应用支持&#xff1a;查询、自定义、收藏各大oj比赛信息&#xff0c;跳转比赛界面。查询各大oj的Rating分以及题量&#xff0c;查看题量饼状图。 应用环境 windows和安卓端 应用预览&#xff1a; 维护概况 后期会提供持续更新&#xff0c;具体可以…

STM32学习历程(day6)

EXTI外部中断使用教程 首先先看下EXTI的框图 看这个框图就能知道要先初始化GPIO外设 那么和前面一样 1、先RCC使能时钟 2、配置GPIO 选择端口为输入模式&#xff0c; 3、配置AFIO&#xff0c;选择我们用的GPIO连接到后面的EXTI 4、配置EXTI&#xff0c;选择边沿触发方式…

全网最适合入门的面向对象编程教程:12 类和对象的 Python 实现-Python 使用 logging 模块输出程序运行日志

全网最适合入门的面向对象编程教程&#xff1a;12 类和对象的 Python 实现-Python 使用 logging 模块输出程序运行日志 摘要&#xff1a; 本文主要介绍了日志的定义和作用&#xff0c;以及 Python 内置日志处理的 logging 模块&#xff0c;同时简单说明了日志等级和 logging …

中职网络安全B模块渗透测试server2380

使用nmap扫描添加参数-sV Flag:2.4.38 添加参数-A不然扫不全 &#xff08;这两题可以直接加-sV -A&#xff09; Flag: 4.3.11-Ubuntu 根据nmap扫描发现系统为ubuntu系统&#xff0c;ubuntu操作系统在某些版本中默认包含一个名为"ubuntu"的用户帐户。这是为了方…

leetcode--从前序与中序遍历序列构造二叉树

leetcode地址&#xff1a;从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,…

中职网络安全Server2216

任务环境说明&#xff1a;✓ 服务器场景&#xff1a;Server2216&#xff08;开放链接&#xff09;✓ 用户名:root密码&#xff1a;1234561.黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程找出启动异常进程的脚本&#xff0c;并将其绝对路径作为Flag值提交…

Java中的 this 关键字是什么意思? this() 又是什么?

目录 问题问题一&#xff1a;什么是this关键字?问题二&#xff1a;什么是this()&#xff1f; 问题 问题一&#xff1a;什么是this关键字? 定义&#xff1a;this 代表当前对象。这个定义比较抽象&#xff0c;举例来回答。 思考一个问题&#xff1a;如果没有 this 会怎样&…

领导者视角:识别系统问题的信号

作为企业的领导者&#xff0c;有时候我们面对的不仅是表面的小问题&#xff0c;而是根深蒂固的系统性问题。如果您发现以下症状&#xff0c;可能就是时候深入挖掘了&#xff1a; 1、资源消耗大&#xff1a;一个看似小的问题&#xff0c;解决起来却不断耗费大量资源。 2、反复无…

图论---无向图中国邮路的实现

开始编程前分析设计思路和程序的整体的框架&#xff0c;以及作为数学问题的性质&#xff1a; 程序流程图&#xff1a; 数学原理&#xff1a; 本质上是找到一条欧拉回路&#xff0c;考虑图中的边权重、顶点的度数以及如何通过添加最少的额外边来构造欧拉回路&#xff0c;涉及到欧…

double和float的区别与使用

double和float类型的区别与使用 在Java中&#xff0c;double和float都是基本数据类型&#xff0c;用于表示浮点数&#xff08;即带有小数点的数&#xff09;。 它们在精度和范围上有所不同&#xff1a; double类型提供了更高的精度和更大的范围&#xff0c;而float类型则精度更…

昇思14天

ResNet50图像分类 1. ResNet50图像分类概述 ResNet50是一种用于图像分类的深度卷积神经网络。图像分类是计算机视觉的基本应用&#xff0c;属于有监督学习范畴。ResNet50通过引入残差结构&#xff0c;解决了深层网络中的退化问题&#xff0c;使得可以训练非常深的网络。 2. …

(自用)共享单车服务器(二) 项目日志

stdin、stdout、stderr 注意&#xff1a;stderr是不缓存的&#xff0c;stdout则进行行间缓存。接下来我们看下行间缓存的效果&#xff0c;请参考以下代码&#xff1a; #include "stdio.h" #include <unistd.h>int main(int argc, char** argv) {for (int i 0…

LNMP搭建Discuz和Wordpress

1、LNMP L:linux操作系统 N&#xff1a;nginx展示前端页面web服务 M&#xff1a;mysql数据库&#xff0c;保存用户和密码&#xff0c;以及论坛相关的内容 P&#xff1a;php动态请求转发的中间件 数据库的作用&#xff1a; 登录时验证用户名和密码 创建用户和密码 发布和…