QML初识

目录

一、关于QML

二、布局定位和锚点

1.布局定位

2.锚点详解

三、数据绑定

1.基本概念

2.绑定方法

3.数据模型绑定

四、附加属性及信号

1.附加属性

2.信号


一、关于QML

QML是Qt框架中的一种声明式编程语言,用于描述用户界面的外观和行为;Quick是Qt框架中的一个模块,允许开发者使用QML来创建用户界面。

特点:

  • 声明式语法:QML采用声明式语法,开发者只需描述界面的外观和行为,而无需关注具体的绘制和布局细节。
  • 与JavaScript的无缝集成:QML可以与JavaScript无缝集成,利用JavaScript的强大功能进行应用程序逻辑的处理。
  • 高效的开发流程:QML将界面设计与应用程序逻辑分离,提高了开发效率。设计师可以专注于界面的设计,而开发者可以专注于应用程序的逻辑实现。
  • 丰富的组件库:Qt Quick提供了丰富的可视化组件、交互类型、动画、模型和视图等,如按钮、文本框、滑块、菜单等,方便开发者快速构建用户界面。
  • 高效的动画和图形处理能力:支持各种图形渲染技术,如OpenGL、WebGL等,可以创建流畅的动画和视觉吸引人的应用程序。
  • 响应式设计:控件可以自动适应不同的屏幕尺寸和设备,确保应用程序在各种设备上都能有良好的用户体验。

      

二、布局定位和锚点

1.布局定位

  • 手动布局:通过设置元素的xy属性,可以将元素放置在特定的坐标位置。这种方式适用于需要精确控制元素位置的场景,但在处理复杂布局时不够灵活。
  • 定位器布局:Qt Quick提供了几种定位器类型,如RowColumnGridFlow,用于自动定位元素。这些定位器可以根据元素的添加顺序和属性设置,将元素排列成一行、一列、网格或流式布局。
  • 锚点布局:锚点布局是QML中最灵活的布局方式,通过指定元素的锚点属性,可以将元素相对于其父元素或其他元素进行定位。

    

2.锚点详解

每个元素都有七条锚线:左、水平中心、右、上、垂直中心、下和基线。通过设置这些锚线的属性,可以实现元素的对齐、填充和偏移等效果。

基本锚点属性:

  • anchors.left:将元素的左边与指定元素的左边对齐。
  • anchors.right:将元素的右边与指定元素的右边对齐。
  • anchors.top:将元素的上边与指定元素的上边对齐。
  • anchors.bottom:将元素的下边与指定元素的下边对齐。
  • anchors.horizontalCenter:将元素的水平中心与指定元素的水平中心对齐。
  • anchors.verticalCenter:将元素的垂直中心与指定元素的垂直中心对齐。
  • anchors.baseline:将元素的基线与指定元素的基线对齐。

特殊锚点属性:

  • anchors.fill:将元素的左边、右边、上边和下边都与指定元素的对应边对齐,实现元素的填充效果。
  • anchors.centerIn:将元素的水平中心和垂直中心都与指定元素的水平中心和垂直中心对齐,实现元素的居中效果。

锚点边距和偏移:

  • 可以通过leftMarginrightMargintopMarginbottomMargin属性设置元素的锚点边距,以指定元素与锚点之间的空白空间量。
  • 还可以使用horizontalCenterOffsetverticalCenterOffset属性设置元素的锚点偏移,以实现更精细的定位控制。

注意事项:

  • 锚点布局的优先级大于绝对定位(即设置xy属性)。
  • 元素的锚点只能设置为其父元素或兄弟元素,不能设置为其他无关元素。

   

示例:

import QtQuickWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Item {id: mItemanchors.fill: parentRectangle {id: bkanchors.fill: mItemcolor: "aliceblue"}Rectangle {width: 50height: 50color: "red"}Rectangle {x: 50y: 50width: 50height: 50color: "blue"}Rectangle {id: rect_centeranchors.centerIn: parentwidth: 50height: 50color: "red"}Rectangle {id: rect_rightanchors.right: parent.rightanchors.verticalCenter: parent.verticalCenteranchors.rightMargin: 20width: 50height: 50color: "green"}Rectangle {id: rect_bottomanchors.bottom: parent.bottomanchors.horizontalCenter: parent.horizontalCenteranchors.bottomMargin: 20width: 50height: 50color: "green"}Rectangle {id: rect_1anchors.right: rect_center.leftanchors.verticalCenter: parent.verticalCenteranchors.bottomMargin: 20width: 50height: 50color: "pink"}Rectangle {id: rect_2anchors.bottom: rect_center.topanchors.horizontalCenter: parent.horizontalCenterwidth: 50height: 50color: "pink"}}
}

运行结果:

    

三、数据绑定

1.基本概念

  • 属性绑定:QML中的属性绑定允许将一个属性的值与另一个属性或表达式进行关联。当关联的属性或表达式的值发生变化时,绑定的属性会自动更新。
  • 单向绑定:QML中的属性绑定通常是单向的,即从数据源到目标属性。这意味着当数据源属性发生变化时,目标属性会自动更新,但反之不然。
  • 动态绑定:QML支持动态绑定,这意味着绑定关系可以在运行时更改。这允许根据应用程序的状态或用户交互来动态更新界面。

ps:在使用属性绑定时,应避免创建循环绑定,这可能导致无限循环和性能问题。

      

2.绑定方法

  • 冒号绑定:这是最常见的绑定方法,使用冒号操作符“:”在属性定义时进行绑定。
  • 使用Binding对象:QML提供了Binding类型来实现更灵活的属性绑定。可以通过创建Binding对象并设置其targetpropertyvalue属性来定义绑定。
  • 使用Qt.binding()函数:可以在JavaScript代码中使用Qt.binding()函数来创建绑定,这种方法允许在运行时动态创建绑定关系。

   

3.数据模型绑定

  • ListView和GridView:在Qt Quick中,可以使用ListViewGridView等组件来显示数据模型中的数据。通过将组件的model属性绑定到一个数据模型,可以实现数据的动态显示和更新。
  • 数据模型的创建:可以使用ListModelXmlListModel等类型在QML中创建数据模型。这些模型可以存储和管理数据,并通过绑定与UI组件进行交互。

  

示例:

import QtQuick
import QtQuick.ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Item {id: mItemanchors.fill: parentproperty int number: Math.ceil(slider_num.value)Label {id: label_numanchors.centerIn: parent//方式1text: "value: " + Math.ceil(slider_num.value)//方式2//text: "value: " + parent.number}Slider {id: slider_numanchors.top: label_num.bottomanchors.horizontalCenter: parent.horizontalCenteranchors.topMargin: 20width: 300from: 0to: 100value: 25}//方式3// Binding {//     when: slider_num.value > 50//     target: label_num//     property: "text"//     value: "value: " + Math.ceil(slider_num.value)// }//方式4// Component.onCompleted: {//     //js数据绑定//     label_num.text = Qt.binding(function(){//         return "value: " + Math.ceil(slider_num.value);//     })// }}}

运行结果:

   

四、附加属性及信号

1.属性

  • 基本属性:直接赋值(静态值或绑定表达式)。
  • 自定义属性:使用 property 关键字声明。

    

2.附加属性

  • 概念:附加属性是一种可以附加到QML对象的额外属性,用于在不破坏对象类型定义的情况下扩展对象的功能。
  • 使用场景:例如在处理用户界面中的键盘事件时,可以使用附加属性来启用或禁用特定对象的键盘输入。
  • 语法:通过在属性名前加上附加类型的名称来访问附加属性,例如Keys.enabled
  • 自定义附加属性:可以通过在C++中创建具有特定属性和信号的附加类型,并在运行时将其附加到特定对象来实现自定义附加属性。

    

3.信号

  • 概念:信号是QML对象发出的事件通知,用于在对象状态发生变化时通知其他对象。
  • 信号处理程序:信号处理程序是在信号发出时被调用的JavaScript函数,用于响应信号事件。
  • 语法:信号处理程序的命名格式为on<SignalName>,例如onClicked
  • 自定义信号:可以在QML中使用signal关键字自定义信号,并在信号发出时调用相关的信号处理程序。
  • 信号连接:可以使用connect方法将信号连接到其他信号或方法,以便在信号发出时执行特定的操作。

   

示例:

import QtQuick
import QtQuick.ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Component.onCompleted: console.log("Window");Item {id: mItemanchors.fill: parentComponent.onCompleted: console.log("Item");}Rectangle {anchors.fill: parentcolor: "aliceblue"Component.onCompleted: console.log("Rectangle");}SwipeView {anchors.fill: parentRectangle {color: SwipeView.index === 0 ? "blue" : "black"}Rectangle {color: SwipeView.index === 0 ? "black" : "green"}Rectangle {color: SwipeView.index === 0 ? "black" : "red"}}
}
  • ===:比较两个值是否严格相等(值和类型都相等)。
  • ==:进行隐式类型转换后比较这两个值。
输出:
qml: Window
qml: Rectangle
qml: Item

    QML引擎初始化组件的顺序是 "从下到上",同一层级的子组件会按照它们在代码中的声明顺序反向触发onCompleted,父组件的onCompleted会先于子组件的onCompleted触发。

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

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

    相关文章

    java项目之美妆产品进销存管理系统的设计与开发源码(ssm+mysql)

    项目简介 美妆产品进销存管理系统的设计与开发实现了以下功能&#xff1a; 美妆产品进销存管理系统的设计与开发的主要使用者分为管理员登录后修改个人的密码。产品分类管理中&#xff0c;对公司内的所有产品分类进行录入&#xff0c;也可以对产品分类进行修改和删除。产品管…

    Python(pymysql包)操作MySQL【增删改查】

    下载pymysql&#xff1a; pip install pymysql 在MySQL中创建数据库&#xff1a;unicom create database unicom DEFAULT CHARSET utf8 COLLATE utf8_general_ci;use unicom; 在unicom中创建数据表&#xff1a;admin create table admin(id int not null primary key auto_i…

    HTTP无状态的概念以及对后端服务的设计会产生的影响

    HTTP无状态(Statelessness) 是指每个HTTP请求都是独立的,服务器不会记住或依赖于前一个请求的任何信息。每次请求的处理都与其他请求没有直接关系。也就是说,服务器在处理请求时,不会存储关于客户端状态的信息。 一、HTTP无状态的具体含义 ①每个请求独立:每个请求包含了…

    操作系统—进程与线程

    补充知识 PSW程序状态字寄存器PC程序计数器&#xff1a;存放下一条指令的地址IR指令寄存器&#xff1a;存放当前正在执行的指令通用寄存器&#xff1a;存放其他一些必要信息 进程 进程&#xff1a;进程是进程实体的运行过程&#xff0c;是系统进行资源分配和调度的一个独立单位…

    【基于SprintBoot+Mybatis+Mysql】电脑商城项目之上传头像和新增收货地址

    &#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【Spring篇】【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f680;1.上传头像 -持久…

    Windows下ollama详细安装指南

    文章目录 1、Windows下ollama详细安装指南1.1、ollama介绍1.2、系统要求1.3、下载安装程序1.4、安装步骤1.5、验证安装1.6、环境变量配置1.7、模型选择与安装【deepseek 示例】1.7.1、拉取并运行模型1.7.2、进阶使用技巧 1、Windows下ollama详细安装指南 1.1、ollama介绍 olla…

    10vue3实战-----实现登录的基本功能

    10vue3实战-----实现登录的基本功能 1.基本页面的搭建2.账号登录的验证规则配置3.点击登录按钮4.表单的校验5.账号的登录逻辑和登录状态保存6.定义IAccount对象类型 1.基本页面的搭建 大概需要搭建成这样子的页面: 具体的搭建界面就不多讲。各个项目都有自己的登录界面&#…

    vue3 点击图标从相册选择二维码图片,并使用jsqr解析二维码(含crypto-js加密解密过程)

    vue3 点击图标从相册选择二维码图片&#xff0c;并使用jsqr解析二维码&#xff08;含crypto-js加密解密过程&#xff09; 1.安装 jsqr 和 crypto-js npm install -d jsqr npm install crypto-js2.在util目录下新建encryptionHelper.js文件&#xff0c;写加密解密方法。 // e…

    支持多种网络数据库格式的自动化转换工具——VisualXML

    一、VisualXML软件介绍 对于DBC、ARXML……文件的编辑、修改等繁琐操作&#xff0c;WINDHILL风丘科技开发的总线设计工具——VisualXML&#xff0c;可轻松解决这一问题&#xff0c;提升工作效率。 VisualXML是一个强大且基于Excel表格生成多种网络数据库文件的转换工具&#…

    【JVM详解四】执行引擎

    一、概述 Java程序运行时&#xff0c;JVM会加载.class字节码文件&#xff0c;但是字节码并不能直接运行在操作系统之上&#xff0c;而JVM中的执行引擎就是负责将字节码转化为对应平台的机器码让CPU运行的组件。 执行引擎是JVM核心的组成部分之一。可以把JVM架构分成三部分&am…

    mysql安装starting the server报错

    win10家庭版无法启动服务的&#xff0c;先不要退出&#xff0c;返回上一栏&#xff0c;然后通过电脑搜索栏输入服务两个字&#xff0c;在里面找到mysql80&#xff0c;右键属性-登录&#xff0c;登录身份切换为本地系统就行了

    萬有的函數關係速成2. 連續和導數

    1.討論間斷點類型 定义: 若函数在某点不满足连续的条件,则该点为间断点。 第一类间断点是左右极限都存在的间断点,其中左右极限相等的是可去间断点,不相等的是跳跃间断点; 第二类间断点是左右极限至少有一个不存在的间断点,包括无穷间断点(极限为无穷)和振荡间断点…

    【专题】2025年我国机器人产业发展形势展望:人形机器人量产及商业化关键挑战报告汇总PDF洞察(附原数据表)

    原文链接&#xff1a;https://tecdat.cn/?p39668 机器人已广泛融入我们生活的方方面面。在工业领域&#xff0c;它们宛如不知疲倦的工匠&#xff0c;精准地完成打磨、焊接等精细工作&#xff0c;极大提升了生产效率和产品质量&#xff1b;在日常生活里&#xff0c;它们是贴心…

    用docker在本地用open-webui部署网页版deepseek

    前置条件 用Ollama在本地CMD窗口运行deepseek大模型-CSDN博客文章浏览阅读109次&#xff0c;点赞5次&#xff0c;收藏2次。首次运行需要下载deepseek的大模型包&#xff08;大约5GB&#xff0c;根据本地网速的不同在半个小时到几个小时之间下载完成&#xff09; &#xff0c;并…

    DeepSeek-R1 云环境搭建部署流程

    DeepSeek横空出世&#xff0c;在国际AI圈备受关注&#xff0c;作为个人开发者&#xff0c;AI的应用可以有效地提高个人开发效率。除此之外&#xff0c;DeepSeek的思考过程、思考能力是开放的&#xff0c;这对我们对结果调优有很好的帮助效果。 DeepSeek是一个基于人工智能技术…

    x小兔鲜vue.js

    LayoutFooter.vue <template><footer class"app_footer"><!-- 联系我们 --><div class"contact"><div class"container"><dl><dt>客户服务</dt><dd><i class"iconfont icon-kef…

    磁盘分区损坏:深度解析与数据恢复策略

    一、磁盘分区损坏现象概述 磁盘分区损坏是计算机数据存储领域的一个常见问题&#xff0c;它通常表现为硬盘上的某个分区无法正常访问&#xff0c;数据读写失败&#xff0c;甚至整个分区消失。这种损坏可能源于多种因素&#xff0c;不仅影响用户的正常使用&#xff0c;更可能导…

    Python----Python高级(网络编程:网络基础:发展历程,IP地址,MAC地址,域名,端口,子网掩码,网关,URL,DHCP,交换机)

    一、网络 早期的计算机程序都是在本机上运行的&#xff0c;数据存储和处理都在同一台机器上完成。随着技术的发展&#xff0c;人 们开始有了让计算机之间相互通信的需求。例如安装在个人计算机上的计算器或记事本应用&#xff0c;其运行环 境仅限于个人计算机内部。这种设置虽然…

    k8sollama部署deepseek-R1模型,内网无坑

    这是目录 linux下载ollama模型文件下载到本地,打包迁移到k8s等无网络环境使用下载打包ollama镜像非k8s环境使用k8s部署访问方式非ollama运行deepseek模型linux下载ollama 下载后可存放其他服务器 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linu…

    机器学习基本概念(附代码)

    这里的“机器”指的是计算机软硬件组织&#xff0c;而非传统的机械装置&#xff1b;而“学习”&#xff0c;则是指软件通过训练过程&#xff0c;其性能得以提升的过程。 一、算法与模型的关系 在机器学习领域&#xff0c;算法和模型是两个核心概念。算法是一种偏抽象的概念&a…