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.布局定位
- 手动布局:通过设置元素的
x和y属性,可以将元素放置在特定的坐标位置。这种方式适用于需要精确控制元素位置的场景,但在处理复杂布局时不够灵活。 - 定位器布局:Qt Quick提供了几种定位器类型,如
Row、Column、Grid和Flow,用于自动定位元素。这些定位器可以根据元素的添加顺序和属性设置,将元素排列成一行、一列、网格或流式布局。 - 锚点布局:锚点布局是QML中最灵活的布局方式,通过指定元素的锚点属性,可以将元素相对于其父元素或其他元素进行定位。
2.锚点详解
每个元素都有七条锚线:左、水平中心、右、上、垂直中心、下和基线。通过设置这些锚线的属性,可以实现元素的对齐、填充和偏移等效果。
基本锚点属性:
anchors.left:将元素的左边与指定元素的左边对齐。anchors.right:将元素的右边与指定元素的右边对齐。anchors.top:将元素的上边与指定元素的上边对齐。anchors.bottom:将元素的下边与指定元素的下边对齐。anchors.horizontalCenter:将元素的水平中心与指定元素的水平中心对齐。anchors.verticalCenter:将元素的垂直中心与指定元素的垂直中心对齐。anchors.baseline:将元素的基线与指定元素的基线对齐。
特殊锚点属性:
anchors.fill:将元素的左边、右边、上边和下边都与指定元素的对应边对齐,实现元素的填充效果。anchors.centerIn:将元素的水平中心和垂直中心都与指定元素的水平中心和垂直中心对齐,实现元素的居中效果。
锚点边距和偏移:
- 可以通过
leftMargin、rightMargin、topMargin和bottomMargin属性设置元素的锚点边距,以指定元素与锚点之间的空白空间量。 - 还可以使用
horizontalCenterOffset和verticalCenterOffset属性设置元素的锚点偏移,以实现更精细的定位控制。
注意事项:
- 锚点布局的优先级大于绝对定位(即设置
x和y属性)。 - 元素的锚点只能设置为其父元素或兄弟元素,不能设置为其他无关元素。
示例:
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对象并设置其target、property和value属性来定义绑定。 - 使用Qt.binding()函数:可以在JavaScript代码中使用
Qt.binding()函数来创建绑定,这种方法允许在运行时动态创建绑定关系。
3.数据模型绑定
- ListView和GridView:在Qt Quick中,可以使用
ListView和GridView等组件来显示数据模型中的数据。通过将组件的model属性绑定到一个数据模型,可以实现数据的动态显示和更新。 - 数据模型的创建:可以使用
ListModel或XmlListModel等类型在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触发。
相关文章:
QML初识
目录 一、关于QML 二、布局定位和锚点 1.布局定位 2.锚点详解 三、数据绑定 1.基本概念 2.绑定方法 3.数据模型绑定 四、附加属性及信号 1.附加属性 2.信号 一、关于QML QML是Qt框架中的一种声明式编程语言,用于描述用户界面的外观和行为;Qu…...
查询已经运行的 Docker 容器启动命令
一、导语 使用 get_command_4_run_container 查询 docker 容器的启动命令 获取镜像 docker pull cucker/get_command_4_run_container 查看容器命令 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock cucker/get_command_4_run_container 容器id或容器名 …...
项目管理中的13个数据分析思维
01 信度与效度思维 信度:是指一个数据或指标自身的可靠程度,包括准确性和稳定性。 效度:是指一个数据或指标的生成,需贴合它所要衡量的事物,即指标的变化能够代表该事物的变化。 在项目管理中,信度和效度的…...
快速查看ROS节点的CPU和内存占用情况
他们可能是在排查资源泄漏的问题,所以需要监控节点的CPU和内存使用情况。可能他们遇到了节点占用过多资源导致服务器崩溃的情况,需要快速定位问题节点。现有的Linux命令方面,top和htop可以实时查看进程资源使用,但用户想要的是针对ROS节点的,可能需要更针对性的工具。ROS本…...
Centos Stream 10 根目录下的文件夹结构
/ ├── bin -> usr/bin ├── boot ├── dev ├── etc ├── home ├── lib -> usr/lib ├── lib64 -> usr/lib64 ├── lostfound ├── media ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin -> usr/sbin ├── srv ├─…...
协议_CAN协议
物理层特征 信号传输原理: CAN控制器根据CAN_L和CAN_H上的电位差来判断总线电平,总线电平分为显性电平(CAN_H与CAN_L压差 2v)、隐性电平(CAN_H与CAN_L压差 0v),发送方通过总线电平的变化&am…...
nuxt3中报错: `setInterval` should not be used on the server.
那是因为在后端渲染没有浏览器的执行环境,一些浏览器环境提供的对象和方法都无法使用,代码判断下就行。 if (import.meta.client) {setInterval(() > {}, 1000) }Import meta Nuxt API...
leetcode_深度搜索和广度搜索 101. 对称二叉树
101. 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称思路: 1.判断根节点的左右子树是否为空, 若都为空则返回True2.根节点的左右子树其中之一为空或子树的根节点的值不同则返回False3.分别判断根节点左右子树是否相同, 判断时, 左边子树的左节点要对应…...
QT修仙之路2-2 对话框 尚欠火候
警告对话框 相关代码 错误对话框 相关代码 消息对话框 相关代码 询问对话框 相关代码 相关代码 警告对话框 QMessageBox::warning(this,"错误","账号密码不能为空",QMessageBox::Ok);错误对话框 QMessageBox msgBox(QMessageBox::Critical,"错误…...
NFT Insider #168:The Sandbox 推出新春{金蛇礼服}套装;胖企鹅合作 LINE Minini
引言:NFT Insider 由 NFT 收藏组织 WHALE Members、BeepCrypto 联合出品, 浓缩每周 NFT 新闻,为大家带来关于 NFT 最全面、最新鲜、最有价值的讯息。每期周报将从 NFT 市场数据,艺术新闻类,游戏新闻类,虚拟…...
ZooKeeper 技术全解:概念、功能、文件系统与主从同步
引言 随着分布式系统变得越来越复杂,对协调服务的需求也在不断增长。ZooKeeper 作为一个由 Apache 维护的开源分布式协调服务框架,广泛用于 Hadoop 生态系统和其他需要协调的分布式环境中。这一系统旨在解决分布式应用中常见的挑战,如配置管…...
什么是deepseek?
AI国产免费开源强大 DeepSeek 是由国内团队开发的一款开源人工智能工具库,专注于提供高效易用的 AI 模型训练与推理能力。它既包含预训练大语言模型(如 DeepSeek-R1 系列),也提供配套工具链,助力开发者快速实现 AI 应用…...
容器服务基础
1.腾讯云容器服务 使用该服务,开发者将无需安装、运维、扩展您的集群管理基础设施,只需进行简单的API调用,便可启动和停止 Docker 应用程序,查询集群的完整状态,以及使用各种云服务。 创建集群--创建工作负载/创建ingr…...
C++基础知识(二)之数据类型、指针和内存、数组
六、C数据类型 1、sizeof运算符 sizeof运算符用于求数据类型或变量占用的内存空间。 用于数据类型:sizeof(数据类型) 用于变量:sizeof(变量名) 或 sizeof 变量名 注意: 在32位和64位操作系统中,同一种数据类型占用的内存空间…...
LLMs之DeepSeek r1:Logic-RL的简介、安装和使用方法、案例应用之详细攻略
LLMs之DeepSeek r1:Logic-RL的简介、安装和使用方法、案例应用之详细攻略 目录 Logic-RL的简介 1、Logic-RL的特点 2、性能 Logic-RL 的安装和使用方法 1、安装 2、使用方法 数据准备 基础模型 指令模型 训练执行 实现细节 Logic-RL的案例应用 Logic-RL…...
AUTOSAR汽车电子嵌入式编程精讲300篇-基于FPGA的CAN FD汽车总线数据交互系统设计
目录 前言 汽车总线以及发展趋势 汽车总线技术 汽车总线发展趋势 CAN FD总线国内外研究现状 2 系统方案及CAN FD协议分析 2.1系统控制方案设计 2.2 CAN FD总线帧结构分析 2.2.1数据帧分析 2.2.2远程帧分析 2.2.3过载帧分析 2.2.4错误帧分析 2.2.5帧间隔分析 2.3位…...
【神经网络框架】非局部神经网络
一、非局部操作的数学定义与理论框架 1.1 非局部操作的通用公式 非局部操作(Non-local Operation)是该研究的核心创新点,其数学定义源自经典计算机视觉中的非局部均值算法(Non-local Means)。在深度神经网络中,非局部操作被形式化为: 其中: 1.2 与传统操作的对比分析…...
22.[前端开发]Day22-CSS单位-CSS预处理器-移动端视口
1 CSS常见单位详解 CSS中的单位 CSS中的绝对单位( Absolute length units ) CSS中的相对单位( Relative length units ) 1.em: 相对自己的font-size;如果自己没有设置, 那么会继承父元素的font-size 2.如果font-size中…...
深入讲解MyBatis
1. MyBatis 的背景和优势 背景:在 Java 开发中,传统的 JDBC 操作数据库代码繁琐,需要手动管理数据库连接、编写 SQL 语句、处理结果集等,开发效率低且容易出错。MyBatis 应运而生,它通过将 SQL 语句与 Java 代码分离&a…...
URL调用本地Ollama模型
curl http://192.168.2.247:11434/api/generate -d "{ \"model\": \"deepseek-r1:8b\", \"prompt\": \"Who r u?\" ,\"stream\":false}" 连续对话...
DeepSeek和ChatGPT的优劣或者区别(答案来DeepSeek和ChatGPT)
DeepSeek的答案 DeepSeek与ChatGPT作为当前两大主流AI模型,在架构设计、性能表现、应用场景等方面存在显著差异,以下从多个维度进行对比分析: 一、架构与训练效率 架构设计 DeepSeek:采用混合专家(MoE)框架…...
【python】matplotlib(animation)
文章目录 1、matplotlib.animation1.1、FuncAnimation1.2、修改 matplotlib 背景 2、matplotlib imageio2.1、折线图2.2、条形图2.3、散点图 3、参考 1、matplotlib.animation 1.1、FuncAnimation matplotlib.animation.FuncAnimation 是 Matplotlib 库中用于创建动画的一个…...
ubuntu24.04安装布置ros
最近换电脑布置机器人环境,下了24.04,但是网上的都不太合适,于是自己试着布置好了,留作有需要的人一起看看。 文章目录 目录 前言 一、确认 ROS 发行版名称 二、检查你的 Ubuntu 版本 三、安装正确的 ROS 发行版 四、对于Ubuntu24…...
Vue Router 导航方式详解:声明式导航与编程式导航
Vue Router 是 Vue.js 官方推荐的路由管理器,提供了两种主要的导航方式:声明式导航和编程式导航。这两种方式各有特点,适用于不同的场景。本文将详细介绍它们的用法、区别以及底层实现原理。 1. 声明式导航 1.1 什么是声明式导航?…...
【RabbitMQ重试】重试三次转入死信队列
以下是基于RabbitMQ死信队列实现消息重试三次后转存的技术方案: 方案设计要点 队列定义改造(核心参数配置) Bean public Queue auditQueue() {Map<String, Object> args new HashMap<>();args.put("x-dead-letter-exchan…...
接入 deepseek 实现AI智能问诊
1. 准备工作 注册 DeepSeek 账号 前往 DeepSeek 官网 注册账号并获取 API Key。 创建 UniApp 项目 使用 HBuilderX 创建一个新的 UniApp 项目(选择 Vue3 或 Vue2 模板)。 安装依赖 如果需要在 UniApp 中使用 HTTP 请求,推荐使用 uni.requ…...
网络爬虫js逆向之异步栈跟栈案例
【注意!!!】 前言: 1. 本章主要讲解js逆向之异步栈跟栈的知识(通过单步执行调试) 2. 使用关键字搜定位加密入口 3. 本专栏通过多篇文章【文字案例】的形式系统化进行描述 4. 本文章全文进行了脱敏处理 5. 详…...
机器学习 - 需要了解的条件概率、高斯分布、似然函数
似然函数是连接数据与参数的桥梁,通过“数据反推参数”的逆向思维,成为统计推断的核心工具。理解它的关键在于区分“参数固定时数据的概率”与“数据固定时参数的合理性”,这种视角转换是掌握现代统计学和机器学习的基础。 一、在学习似然函…...
string 与 wstring 的字符编码
测试代码: #include<stdio.h> #include<stdlib.h> #include<windows.h> #include <locale.h> #include <string> #include <iostream>// 函数用于计算UTF-8字符串中的字符数 int utf8_strlen(const char* str) {int len = 0;for (; *s…...
【Spring】什么是Spring?
什么是Spring? Spring是一个开源的轻量级框架,是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…...
