当前位置: 首页 > news >正文

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)。
  • 绘制椭圆中,绘制了两个椭圆,外圈为黑色,内圈为白色。
  • 动态计算每个文字在椭圆轨迹上的位置,角度通过滑块值和文字索引动态调整。
  • 在每个文字位置绘制刻度线,长度固定。
  • 当滑块 sliderslider2 值发生变化时,调用 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 主要用于无人机吊舱视角的模拟&#xf…...

炸砖块游戏的最终图案

描述 小红正在玩一个“炸砖块”游戏,游戏的规则如下:初始有一个 n * m 的砖块矩阵。小红会炸 k 次,每次会向一个位置投炸弹,如果这个位置有一个砖块,则砖块消失,上方的砖块向下落。小红希望你画出最终砖块的图案。 输入描述 第一行输入三个正整数 n, m, k,代表矩阵的行…...

LLM的实验平台有哪些:快速搭建测试大语言模型

LLM的实验平台有哪些:快速搭建测试大语言模型 目录 LLM的实验平台有哪些:快速搭建测试大语言模型低代码平台工程观测平台本地应用平台在线编程竞技场性能排名代码质量评估开源框架Hugging Face是一个机器学习和数据科学平台及社区主要功能开源工具与库应用场景优势低代码平台…...

python3GUI--大屏可视化-XX产业大数据指挥舱(附下载地址) By:PyQt5

文章目录 一&#xff0e;前言二&#xff0e;预览三&#xff0e;软件开发心得1.使用方法2.UI设计3.代码架构4.项目结构 四&#xff0e;代码片段分享1.图片平滑缩放组件2.滚动日志组件 五&#xff0e;心得体会 大小&#xff1a;35.0 M&#xff0c;软件安装包放在了这里! 本软件未…...

.NET 9.0 的 Blazor Web App 项目中 Hash 变换(MD5、Pbkdf2) 使用备忘

一、生成 string 对应的 MD5 码 /// <summary>/// 生成 string 对应的 MD5 码/// </summary>/// <param name"str">需要转换的字符串 string&#xff1a;用于登录认证时&#xff0c;str username 线下传递的key DateTime.Now.Ticks.ToString() …...

uniapp 抖音小程序 getUserProfile:fail must be invoked by user tap gesture

项目场景&#xff1a; uniapp 抖音小程序 getUserProfile:fail must be invoked by user tap gesture,在实现点击头像需要出发抖音小程序获取用户原生头像的操作中&#xff0c;无论如何也无法触发抖音的原生窗口&#xff01; 问题描述 这个问题我找了很多博主的方法&#xff…...

(undone) MIT6.S081 2023 学习笔记 (Day5: LAB4 traps)

LAB 网页&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/traps.html 任务1&#xff1a;RISC-V assembly (完成) 初步看问题要求&#xff0c;这是一道文科题(问答题) 在你的 xv6 仓库中有一个文件 user/call.c。执行 make fs.img 会对其进行编译&#xff0c;并生成…...

前端笔记----

在我的理解里边一切做页面的代码都是属于前端代码。 之前用过qt框架&#xff0c;也是用来写界面的&#xff0c;但是那是用来写客户端的&#xff0c;而html是用来写web浏览器的&#xff0c;相较之下htmlcssJavaScript写出来的界面是更加漂亮的。这里就记录我自个学习后的一些笔…...

学习华为熵减,激发组织活力

目录 为什么学习华为&#xff1f; 学习华为什么&#xff1f; 一、势&#xff1a;顺势而为&#xff0c;在风口上猪都会飞起来。 二、道&#xff1a;就是认识和利用规律层面&#xff0c;文化和制度创新就是企业经营之道。 三、法&#xff1a;就是一套价值管理的变革方法论。…...

9Hive数据倾斜

这里写目录标题 数据倾斜问题剖析数据倾斜解决方案1. 空值引发的数据倾斜2. 不同数据类型引发的数据倾斜3. 不可拆分大文件引发的数据倾斜4. 数据膨胀引发的数据倾斜5. 表连接时引发的数据倾斜6. 确实无法减少数据量引发的数据倾斜 总结 数据倾斜问题剖析 数据倾斜是分布式系统…...

【大数据】机器学习 -----关于data.csv数据集分析案例

打开表 import pandas as pd df2 pd.read_csv("data.csv",encoding"gbk") df2.head()查看数据属性&#xff08;列标题&#xff0c;表形状&#xff0c;类型&#xff0c;行标题&#xff0c;值&#xff09; print("列标题:",df2.columns)Data…...

深入解析 C++ 类型转换

简介 C 类型转换是开发者必须掌握的重要技能之一, 无论是处理隐式转换还是显式转换, 理解其背后的机制与用法至关重要. 本篇博客旨在从基础到高级全面解析 C 的类型转换, 包括实际开发中的应用场景和性能分析. 自动转换 隐式类型转换 编译器可以在无需明确指示的情况下, 将一…...

C++ union 联合(八股总结)

union&#xff08;联合体&#xff09;允许在同一内存位置上存储不同的数据类型&#xff0c;所有成员共享相同的内存空间。 内存布局 由于联合体的所有成员都共享同一块内存&#xff0c;因此联合体的大小是其最大成员的大小。联合体的实际大小取决于其最大成员的类型和对齐要求…...

聊聊AI Agent

什么是AI Agent&#xff1f; AI Agent指的是一种使用人工智能技术的自主实体&#xff0c;它能够感知环境、做出决策&#xff0c;并采取行动以实现特定目标。AI Agent的核心思想是它能够独立运作&#xff0c;基于输入信息做出有根据的决策&#xff0c;并通过学习算法不断提高自…...

scala代码打包配置(maven)

目录 mavenpom.xml打包配置项&#xff08;非完整版&#xff0c;仅含打包的内容< build>&#xff09;pom.xml完整示例&#xff08;需要修改参数&#xff09;效果说明 maven 最主要的方式还是maven进行打包&#xff0c;也好进行配置项的管理 以下为pom文件&#xff08;不要…...

慧集通(DataLinkX)iPaaS集成平台-业务建模之业务对象(二)

3.UI模板 当我们选择一条已经建好的业务对象点击功能按钮【UI模板】进入该业务对象的UI显示配置界面。 右边填写的是UI模板的编码以及对应名称&#xff1b;菜单界面配置以业务对象UI模板编码获取显示界面。 3.1【列表-按钮】 展示的对应业务对象界面的功能按钮配置&#xff1…...

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…...

【大模型】大语言模型的数据准备:构建高质量训练数据的关键指南

大语言模型的数据准备&#xff1a;构建高质量训练数据的关键指南 大语言模型&#xff08;LLM, Large Language Model&#xff09;的训练离不开高质量的数据&#xff0c;而数据准备是模型性能的基石。无论是预训练还是微调&#xff0c;数据的选择、清洗和标注都会直接影响模型的…...

【解决】okhttp的java.lang.IllegalStateException: closed错误

问题 Android 使用OKHttp进行后端通信&#xff0c;后端处理结果&#xff0c;反馈给前端的responseBody中其实有值&#xff0c;但是一直报异常&#xff0c;后来才发现主要是OkHttp请求回调中response.body().string()只能有效调用一次&#xff0c;而我使用了两次&#xff1a; 解…...

TCP-IP详解卷 TCP的超时与重传

TCP-IP详解卷1-21&#xff1a;TCP的超时与重传&#xff08;Timeout and Retransmission&#xff09; 一&#xff1a;介绍 1&#xff1a; 与数据链路层的ARQ协议相类似&#xff0c;TCP使用超时重发的重传机制。 即&#xff1a;TCP每发送一个报文段&#xff0c;就对此报文段设置…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...