QT Quick QML 实例之椭圆投影,旋转
文章目录
- 一、前言
- 二、演示
- 三、部分代码与分析
QML 其它文章请点击这里: QT QUICK QML 学习笔记
国际站点 GitHub: https://github.com/chenchuhan
国内站点 Gitee : https://gitee.com/chuck_chee
一、前言
此 Demo 主要用于无人机吊舱视角的模拟,这种动态调整椭圆比例和方向文字的功能可以很好地表示吊舱的俯仰角变化和视野方向。通过滑块调整俯仰角,椭圆比例随之改变,同时方向标记实时旋转,能够直观反映无人机当前的视角范围和角度变化。
二、演示
-
椭圆的俯仰角与动态缩放:
pitchangle随着滑块高度变化改变椭圆纵向半径 (radiusY),模拟俯仰角变化。 -
文本在椭圆轨迹上旋转,通过
ellipseCanvas.movingTextAngle动态计算角度,滑块拖动时实时更新。

三、部分代码与分析
右侧滑块
- 通过
MouseArea设置了竖直方向 (Drag.YAxis) 的拖动行为,并限定滑块移动范围。 - 梯度与样式:滑块本身采用了绿色到蓝色的渐变样式,且支持抗锯齿。
- 信号处理:
onYChanged调用ellipseCanvas.requestPaint(),触发椭圆和文字的重新绘制。
Rectangle {anchors.fill: parent;color: "lightGray"Rectangle {id: containeranchors {top: parent.top;topMargin: _margin * 2;bottom: parent.bottom;bottomMargin: _margin *2;right: parent.right;rightMargin: _margin}width: _pixradius: width/2;opacity: 0.6 //不透明度antialiasing: true // 抗锯齿,具体效果见下面图片//黑色——>棕色的渐变gradient: Gradient {GradientStop { position: 0.0; color: "black" }GradientStop { position: 1.0; color: "brown" }}//[重点2]:当面板放大放小的时候,需要保持滑块的比例不变onHeightChanged: {if(height <= slider.height){ //当缩小的太小的时候,可以把小滑块也跟着变小slider.height = height; //小滑块高度 = 滑道高度}else {slider.height = _pix*2; //小滑块高度 = 固定高度var _scale = (height - _pix*2) / (oldHeight - _pix*2)//比列尺 * 之前的实际距离slider.y = slider.y * _scale;oldHeight = height;//[重点3]默认中间值,也会随着长宽拖动而变化的。_defaultSilderValue = height/2-_pix;}}//小滑块条Rectangle {id: sliderx: 1; y: container.height/2-_pix; //y轴向向下为负, 默认滑块放中间width: _pix-2; height: _pix*2 ;radius: width/2;antialiasing: truegradient: Gradient {GradientStop { position: 0.0; color: "green" }GradientStop { position: 1.0; color: "aqua" }}MouseArea {anchors.fill: parentanchors.margins: -_pixdrag.target: parent;drag.axis: Drag.YAxisdrag.minimumY: 1;drag.maximumY: container.height - slider.height-1;}onYChanged: {ellipseCanvas.requestPaint()}}}}
下侧滑块
- 控制旋转角度
ellipseCanvas.movingTextAngle,其值直接绑定到Text显示的内容。 - 滑块范围设置为 0-360,用于控制画布中旋转文本的角度。
Slider {id: slider2width: parent.width * 0.8height: 20minimumValue: 0maximumValue: 360stepSize: 1anchors.bottom: parent.bottomanchors.bottomMargin: 20anchors.horizontalCenter: parent.horizontalCenteronValueChanged : {ellipseCanvas.movingTextAngle = value;ellipseCanvas.requestPaint();}}
中间画布 :
- 主要负责绘制动态椭圆和沿轨道旋转的文字。通过纵向半径 (
radiusY) 依据滑块位置动态变化,模拟俯仰角比例 (pitchangle)。 - 绘制椭圆中,绘制了两个椭圆,外圈为黑色,内圈为白色。
- 动态计算每个文字在椭圆轨迹上的位置,角度通过滑块值和文字索引动态调整。
- 在每个文字位置绘制刻度线,长度固定。
- 当滑块
slider或slider2值发生变化时,调用ellipseCanvas.requestPaint()触发重绘。
Canvas {id: ellipseCanvasproperty real movingTextAngle: 0 // 控制“北”文字的角度anchors.fill: parentonPaint: {var ctx = ellipseCanvas.getContext('2d');var startX = ellipseCanvas.width / 2 - radius;var startY = ellipseCanvas.height / 2 - radius;var radiusX = radiusvar pitchangle = (slider.y)/(container.height- _margin *4)var radiusY = radiusX * pitchangle;console.log("[pitchangle]:", pitchangle)ctx.clearRect(0, 0, ellipseCanvas.width, ellipseCanvas.height);ctx.lineWidth = 5ctx.strokeStyle= "black"ctx.beginPath();ctx.ellipse(startX, startY, radiusX*2, radiusY*2);ctx.stroke();ctx.lineWidth = 3ctx.strokeStyle= "white"ctx.beginPath();ctx.ellipse(startX, startY, radiusX*2, radiusY*2);ctx.stroke();// 设置文本样式ctx.font = "20px Arial";ctx.fillStyle = "black";// 绘制沿椭圆轨道旋转的文本var textArray = ["东", "南", "西", "北"];var textAngleStep = Math.PI / 2; // 每个文本之间的角度差for (var i = 0; i < textArray.length; i++) {var textAngle = i * textAngleStep; // 计算文本的角度// 计算文本位置,输入角度从 0 到 360 度var angleInRadians = (Math.PI * ellipseCanvas.movingTextAngle / 180 + i * textAngleStep) % 360;var x = startX + radiusX + (radiusX - ctx.measureText(textArray[i]).width*1.2) * Math.cos(angleInRadians) ;var y = startY + radiusY + (radiusY - ctx.measureText(textArray[i]).width*1.2) * Math.sin(angleInRadians);// 绘制文本ctx.fillText(textArray[i], x-ctx.measureText(textArray[i]).width/2, y+ctx.measureText(textArray[i]).width/2);// 绘制刻度线ctx.strokeStyle = "red"var tickLength = 10; // 刻度长度// 绘制刻度线ctx.beginPath();ctx.moveTo(startX + radiusX + radiusX*Math.cos(angleInRadians),startY + radiusY + radiusY*Math.sin(angleInRadians))ctx.lineTo(startX + radiusX + radiusX*Math.cos(angleInRadians) - tickLength * Math.cos(angleInRadians),startY + radiusY + radiusY*Math.sin(angleInRadians) - tickLength * Math.sin(angleInRadians));ctx.stroke();}}}
}
QML 其它文章请点击这里: QT QUICK QML 学习笔记
相关文章:
QT Quick QML 实例之椭圆投影,旋转
文章目录 一、前言二、演示三、部分代码与分析 QML 其它文章请点击这里: QT QUICK QML 学习笔记 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 一、前言 此 Demo 主要用于无人机吊舱视角的模拟…...
炸砖块游戏的最终图案
描述 小红正在玩一个“炸砖块”游戏,游戏的规则如下:初始有一个 n * m 的砖块矩阵。小红会炸 k 次,每次会向一个位置投炸弹,如果这个位置有一个砖块,则砖块消失,上方的砖块向下落。小红希望你画出最终砖块的图案。 输入描述 第一行输入三个正整数 n, m, k,代表矩阵的行…...
LLM的实验平台有哪些:快速搭建测试大语言模型
LLM的实验平台有哪些:快速搭建测试大语言模型 目录 LLM的实验平台有哪些:快速搭建测试大语言模型低代码平台工程观测平台本地应用平台在线编程竞技场性能排名代码质量评估开源框架Hugging Face是一个机器学习和数据科学平台及社区主要功能开源工具与库应用场景优势低代码平台…...
python3GUI--大屏可视化-XX产业大数据指挥舱(附下载地址) By:PyQt5
文章目录 一.前言二.预览三.软件开发心得1.使用方法2.UI设计3.代码架构4.项目结构 四.代码片段分享1.图片平滑缩放组件2.滚动日志组件 五.心得体会 大小:35.0 M,软件安装包放在了这里! 本软件未…...
.NET 9.0 的 Blazor Web App 项目中 Hash 变换(MD5、Pbkdf2) 使用备忘
一、生成 string 对应的 MD5 码 /// <summary>/// 生成 string 对应的 MD5 码/// </summary>/// <param name"str">需要转换的字符串 string:用于登录认证时,str username 线下传递的key DateTime.Now.Ticks.ToString() …...
uniapp 抖音小程序 getUserProfile:fail must be invoked by user tap gesture
项目场景: uniapp 抖音小程序 getUserProfile:fail must be invoked by user tap gesture,在实现点击头像需要出发抖音小程序获取用户原生头像的操作中,无论如何也无法触发抖音的原生窗口! 问题描述 这个问题我找了很多博主的方法ÿ…...
(undone) MIT6.S081 2023 学习笔记 (Day5: LAB4 traps)
LAB 网页:https://pdos.csail.mit.edu/6.S081/2023/labs/traps.html 任务1:RISC-V assembly (完成) 初步看问题要求,这是一道文科题(问答题) 在你的 xv6 仓库中有一个文件 user/call.c。执行 make fs.img 会对其进行编译,并生成…...
前端笔记----
在我的理解里边一切做页面的代码都是属于前端代码。 之前用过qt框架,也是用来写界面的,但是那是用来写客户端的,而html是用来写web浏览器的,相较之下htmlcssJavaScript写出来的界面是更加漂亮的。这里就记录我自个学习后的一些笔…...
学习华为熵减,激发组织活力
目录 为什么学习华为? 学习华为什么? 一、势:顺势而为,在风口上猪都会飞起来。 二、道:就是认识和利用规律层面,文化和制度创新就是企业经营之道。 三、法:就是一套价值管理的变革方法论。…...
9Hive数据倾斜
这里写目录标题 数据倾斜问题剖析数据倾斜解决方案1. 空值引发的数据倾斜2. 不同数据类型引发的数据倾斜3. 不可拆分大文件引发的数据倾斜4. 数据膨胀引发的数据倾斜5. 表连接时引发的数据倾斜6. 确实无法减少数据量引发的数据倾斜 总结 数据倾斜问题剖析 数据倾斜是分布式系统…...
【大数据】机器学习 -----关于data.csv数据集分析案例
打开表 import pandas as pd df2 pd.read_csv("data.csv",encoding"gbk") df2.head()查看数据属性(列标题,表形状,类型,行标题,值) print("列标题:",df2.columns)Data…...
深入解析 C++ 类型转换
简介 C 类型转换是开发者必须掌握的重要技能之一, 无论是处理隐式转换还是显式转换, 理解其背后的机制与用法至关重要. 本篇博客旨在从基础到高级全面解析 C 的类型转换, 包括实际开发中的应用场景和性能分析. 自动转换 隐式类型转换 编译器可以在无需明确指示的情况下, 将一…...
C++ union 联合(八股总结)
union(联合体)允许在同一内存位置上存储不同的数据类型,所有成员共享相同的内存空间。 内存布局 由于联合体的所有成员都共享同一块内存,因此联合体的大小是其最大成员的大小。联合体的实际大小取决于其最大成员的类型和对齐要求…...
聊聊AI Agent
什么是AI Agent? AI Agent指的是一种使用人工智能技术的自主实体,它能够感知环境、做出决策,并采取行动以实现特定目标。AI Agent的核心思想是它能够独立运作,基于输入信息做出有根据的决策,并通过学习算法不断提高自…...
scala代码打包配置(maven)
目录 mavenpom.xml打包配置项(非完整版,仅含打包的内容< build>)pom.xml完整示例(需要修改参数)效果说明 maven 最主要的方式还是maven进行打包,也好进行配置项的管理 以下为pom文件(不要…...
慧集通(DataLinkX)iPaaS集成平台-业务建模之业务对象(二)
3.UI模板 当我们选择一条已经建好的业务对象点击功能按钮【UI模板】进入该业务对象的UI显示配置界面。 右边填写的是UI模板的编码以及对应名称;菜单界面配置以业务对象UI模板编码获取显示界面。 3.1【列表-按钮】 展示的对应业务对象界面的功能按钮配置࿱…...
C++使用minio-cpp库在minio中创建bucket
直接看代码 #include <iostream> #include <string>#include "miniocpp/client.h"int main() {minio::s3::BaseUrl baseUrl("base url");minio::creds::StaticProvider staticProvider("access key", "secret key");mini…...
【大模型】大语言模型的数据准备:构建高质量训练数据的关键指南
大语言模型的数据准备:构建高质量训练数据的关键指南 大语言模型(LLM, Large Language Model)的训练离不开高质量的数据,而数据准备是模型性能的基石。无论是预训练还是微调,数据的选择、清洗和标注都会直接影响模型的…...
【解决】okhttp的java.lang.IllegalStateException: closed错误
问题 Android 使用OKHttp进行后端通信,后端处理结果,反馈给前端的responseBody中其实有值,但是一直报异常,后来才发现主要是OkHttp请求回调中response.body().string()只能有效调用一次,而我使用了两次: 解…...
TCP-IP详解卷 TCP的超时与重传
TCP-IP详解卷1-21:TCP的超时与重传(Timeout and Retransmission) 一:介绍 1: 与数据链路层的ARQ协议相类似,TCP使用超时重发的重传机制。 即:TCP每发送一个报文段,就对此报文段设置…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
