15. Canvas制作汽车油耗仪表盘

2023-11-15

1. 说明

本篇文章在14. 利用Canvas组件制作时钟的基础上进行一些更改,想查看全面的代码可以点击链接查看即可。
效果展示:
在这里插入图片描述

2. 整体代码

import QtQuick 2.15
import QtQuick.Controls 2.15

Item{
    id:root
    implicitWidth: 400
    implicitHeight: implicitWidth

    // 尺寸属性
    property real outerCircleRadius:root.width / 2.05
    property real innerCircleRadius:root.width / 2.05

    // 颜色属性
    property color bgColor:Qt.rgba(0,0,0,0)
    property color outerColor:"black"
    property color innerColor:"black"
    property color innerRootColor:"lightSlateGray"
    property color innerLineColorL:Qt.rgba(1,1,1,1)
    property color innerLineColorS:Qt.rgba(1,1,1,0.8)
    property color textColor:"white"
    property color secondLineColor:"red"

    // 指针
    property var seconds
    property alias secondsAngle:secondLine.angle

    // 绘制背景
    Canvas{
        id:bgCircle
        width: root.width
        height: root.height
        anchors.centerIn: parent
        onPaint: {
            // 绘制背景
            var ctx = getContext("2d")  
            ctx.save()
            ctx.lineWidth = root.width/50   
            ctx.fillStyle = bgColor
            ctx.beginPath()
            ctx.arc(root.width/2,root.height/2,outerCircleRadius,Math.PI * (5/6),Math.PI * (1/6))
            ctx.fill()
            ctx.restore()
        }
    }
    // 绘制圆环轮廓
    Canvas{
        id:outerCircle
        width: root.width
        height: root.height
        anchors.centerIn: parent
        onPaint: {
            var ctx = getContext("2d")  //创建画师
            //为画师创建画笔并设置画笔属性
            ctx.lineWidth = root.width/50   //设置画笔粗细
            ctx.strokeStyle = outerColor    //设置画笔颜色
            ctx.beginPath()     //每次绘制调用此函数,重新设置一个路径
            // 按照钟表刻度进行划分,一圈是Math.PI * 2,分成12个刻度,每个刻度占用 1/6
            // canvas绘制圆弧,是按照顺时针绘制,起点默认在三点钟方向
            ctx.arc(root.width/2,root.height/2,outerCircleRadius,Math.PI * (5/6),Math.PI * (1/6))
            ctx.stroke()    //根据strokeStyle对边框进行描绘
        }
    }
    // 绘制秒针线
    Canvas{
        id:secondLine
        width: root.width
        height: root.height
        anchors.centerIn: parent
        property real angle:Math.PI * (8/6)
        onPaint: {
            var ctx = getContext("2d")
            ctx.clearRect(0,0,width,height)
            ctx.save()
            ctx.beginPath()
            ctx.lineWidth = root.width/100
            ctx.strokeStyle=secondLineColor
            // 平移坐标点(注意:坐标系原点先平移,再旋转)
            ctx.translate(root.width/2,root.height/2)
            // 旋转坐标系
            ctx.rotate(angle)
            // 坐标原点变化之后再进行实际的绘图
            ctx.moveTo(0,-10);
            ctx.lineTo(0,outerCircleRadius / 1.5);
            ctx.stroke()
            ctx.restore()
        }
    }
    // 绘制圆环内衬
    Canvas{
        id:innerCircle
        width: root.width
        height: root.height
        anchors.centerIn: parent
        property real endAngle:Math.PI * (12/6)
        onPaint: {
            var ctx = getContext("2d")  
            ctx.save()
            ctx.lineWidth = root.width/50   
            ctx.strokeStyle = innerColor     
            ctx.beginPath()     
            ctx.arc(root.width/2,root.height/2,innerCircleRadius,Math.PI * (5/6),Math.PI * (1/6))
            ctx.stroke()    
            ctx.restore()

            // 绘制指针根部圆圈
            ctx.save()
            ctx.lineWidth = root.width/50   
            ctx.fillStyle = innerRootColor
            ctx.beginPath()
            ctx.arc(root.width/2,root.height/2,innerCircleRadius/8,0,endAngle)
            ctx.fill()
            ctx.restore()
        }
    }
    // 绘制刻度线
    Canvas{
        id:innerLine
        width: root.width
        height: root.height
        anchors.centerIn: parent
        property real lineNums:60
        onPaint: {
            var ctx = getContext("2d")  
            for (var i = 0; i <= lineNums; ++i){
                if(i > 5 && i < 25){
                    continue
                }
                ctx.beginPath();
                var angle = 2 * Math.PI / 60 * i;
                var dx = Math.cos(angle)*(outerCircleRadius-15);
                var dy = Math.sin(angle)*(outerCircleRadius-15);
                var dx2 = Math.cos(angle)*(outerCircleRadius-7);
                var dy2 = Math.sin(angle)*(outerCircleRadius-7);
                if (i % 5 === 0 && i != 25 && i != 30){
                    ctx.lineWidth = root.width/100
                    ctx.strokeStyle = innerLineColorL
                }else if(i >= 25 && i <= 30){
                    ctx.strokeStyle = "red"
                }
                else{
                    ctx.lineWidth = root.width/200
                    ctx.strokeStyle = innerLineColorS
                }
                ctx.moveTo(root.width/2+dx,root.height/2+dy);
                ctx.lineTo(root.width/2+dx2,root.height/2+dy2);
                ctx.stroke();
            }
        }
    }
    // 绘制数字
    Canvas{
        id:drawText
        width: root.width
        height: root.height
        anchors.centerIn: parent
        property var numbers : [1,2,3,4,5,6,7,8,9,10,11,12]
        onPaint: {
            var ctx = getContext("2d")
            ctx.font = "18px Arial";
            ctx.textAlign = "center";
            ctx.textBaseline = "middle";
            for(var i = 0; i < 12; ++i)
            {
                ctx.fillStyle = textColor
                var angle = 2 * Math.PI / 12 * numbers[i] - 3.14 / 2;
                var dx = Math.cos(angle)*(outerCircleRadius-35);
                var dy = Math.sin(angle)*(outerCircleRadius-35);
                switch(i){
                case 3:
                    ctx.fillText(1,root.width/2 + dx,root.height / 2 + dy);
                    ctx.fill()
                    break
                case 7:
                    ctx.fillText(0,root.width/2 + dx,root.height / 2 + dy);
                    ctx.fill()
                    break
                case 11:
                    ctx.fillText("1/2",root.width/2 + dx,root.height / 2 + dy);
                    ctx.fill()
                    break
                default:
                    break
                }
            }
        }
    }
    Image{
        id:iconImg
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.top: parent.top
        anchors.topMargin: 5
        scale: 0.25
        source: "qrc:/油箱.png"
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

15. Canvas制作汽车油耗仪表盘 的相关文章

  • 添加到画布后更改文本

    在fabric js中 我正在制作矩形组和文本字段 然后将其添加到画布中 我正在使用以下代码 但是一旦将文本字段添加到画布中 我可以更改文本字段的文本吗 我做了小提琴请检查 http jsfiddle net HAb4N 5 http js
  • 保持文本在画布上垂直居中

    我遇到的问题是将用户输入的文本保持在画布元素内垂直居中 我已经构建了一个测试环境来尝试解决这个问题 我在这篇文章中提供了该环境以及小提琴 这是我的代码 HTML Enter Your Text br
  • 如何使用 Phonegap 将图像加载到 HTML5 Canvas 上

    尝试将图像加载到 html5 画布上 然后使用 Phonegap 在 Android 上运行 html5 这是我的 HTML
  • 如何为网页上的文本绘制添加动画效果?

    我想要一个网页 其中有一个居中的单词 我希望用动画绘制这个单词 以便页面以与我们相同的方式 写 出该单词 即它从一个点开始 随着时间的推移绘制直线和曲线 以便最终结果是一个字形 我不在乎这是否完成
  • 缩放图像以适合画布

    我有一个允许用户上传图像的表单 加载图像后 我们对其进行一些缩放 以减小其文件大小 然后再将其传回服务器 为此 我们将其放置在画布上并在那里对其进行操作 此代码将在画布上渲染缩放后的图像 画布尺寸为 320 x 240px ctx draw
  • 如何为 HTML5 画布上下文设置 2 种字体?

    我试图让画布在绘制文本时使用两种字体 这是因为我的主要字体是 Comic Sans MS 这是一个儿童应用程序 由于我在 iPad 上找不到 Comic Sans 因此我尝试用 MarkerFelt Thin 来替代它 我尝试使用以下语句的
  • 有像 Blend 这样的 HTML5 画布动画软件吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有没有像 Blend 这样的软件可以使用 HTML5 尤其是做动画相关的东西 就像是http raphaeljs com http raphaeljs
  • Qt、QML 和 Windows 8 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直对Qt框架引入的QML很好奇 但从未有机会使用它 但现在随着 Windows 8 的到来 基于旧式小部件的界面将变得过时 只是我
  • Javascript画布不重画?

    我正在开发一个游戏 基于画布 并且遇到了问题 显然 当我按下一个键时 画布并没有更新对象的 x 和 y 它什么也没做 变量本身正在更新 但屏幕上的对象没有更新 这是代码 var canvas document createElement c
  • 如何为多个画布图像填充颜色?

    这是我第一次使用 html5 canvas 我还不知道它是如何工作的 我的问题是 我必须修改画布中图像的颜色 如果只有一张图像 这很容易 但是 我会有不止一张 换句话说 重叠的图像 为了进一步理解我的问题 我创建了一个插图 只有 2 个图像
  • 在 SVG 中使用变换模拟枢轴旋转

    我在 SVG 中有一个矩形 需要从特定点绕轴旋转 我能想到的最好方法是变换到枢轴的 xy 旋转角度 然后再次变换 问题是第二个变换的 xy 我认为它会在某种程度上采用 cos 和 sin 只是不确定在哪里或为什么 会旋转 90度到 也许我以
  • 当我使用 ctx.drawImage() 在画布中放置另一个图像时,无法将画布另存为图像

    我正在尝试制作绘图应用程序 您可以在画布上绘制一些内容 并通过单击 保存 按钮将结果保存为服务器上的图像 您还可以放置另一张图像作为绘图的背景 问题是 当我使用 ctx drawImage 将图像放入画布时 我无法将画布保存为图像 因为什么
  • Canvas 动画在 FireFox 中卡顿,但在 Chrome 中完美

    我最近开始做一些 HTML5 Canvas 的东西 并且很高兴地开展我的业务 在 Chrome 中测试东西 直到我决定尝试我在 Firefox 中所做的事情 效果不太好 这是我正在做的事情的一个简单的例子 设置基本的 requestAnim
  • QML 适合所有分辨率的屏幕

    大家好 我的 QML 代码有问题 我犯了一个错误 我给元素设置了一定的大小 现在我在将应用程序放在其他设备上时遇到了问题 我会将我的代码粘贴到有宽度和高度的位置 以便您可以更改它以向我展示如何使用动态调整大小 我需要说我正在使用以下代码从
  • HTML Canvas:如何绘制翻转/镜像图像?

    当我在 HTML 画布上绘制图像时 我试图翻转 镜像图像 我发现一个游戏教程显示了角色必须面对的每个方向的精灵表 但这对我来说似乎不太正确 特别是因为每个框架都有不同的尺寸 实现这一目标的最佳技术是什么 我尝试致电setScale 1 1
  • 在画布中的鼠标位置放大/缩小

    我正在尝试使用 p5 js 实现缩放功能 当前缩放级别以及 x 和 y 位置存储在controls view目的 默认位置或 0 0 位置位于左上角 问题是调整放大 缩小时的 x 和 y 位置值 以便无论视图的当前位置是什么 它都会停留在缩
  • 如何检测形状是否被单击(HTML5 画布)?

    我正在使用画布绘制不同的形状 如矩形 三角形 六边形等lineTo方法如这个博客 http blog riacode in 2011 03 03 drawing regular polygons in html5 canvas 我只是想要一
  • 将画布的鼠标坐标转换为地理坐标

    我正在尝试使用 Python Tkinter 创建包含意大利所有城市的地图Canvas 我在网上找到了一张意大利地图的图片 其中突出显示了一些城市 并将其插入到我的Canvas 之后 我使用一个函数来确定 2 个突出显示的城市的画布坐标 i
  • 使用画布矩形裁剪图像

    裁剪图像无法正常工作 我哪里错了 我的Xaml
  • KineticJS - 将舞台缩放到视口

    我正在努力将默认分辨率设置为 1366x756 我会根据视口来放大和缩小它 类似于此处显示的示例 http blogs msdn com b davrous archive 2012 04 06 modernizing your html5

随机推荐

  • 转 不管你学的是什么专业,你都应该多少懂些管理学的东西

    转 不管你学的是什么专业 你都应该多少懂些管理学的东西 蝴蝶效应 青蛙现象 鳄鱼法则 鲇鱼效应 羊群效应 刺猬法则 手表定律 破窗理论 二八定律 木桶理论 马太效应 鸟笼逻辑 责任分散效应 帕金森定律 晕轮效应 霍桑效应 习得性无助实验 证
  • 基于SpringBoot+thymeleaf的课程分享平台(源码免费获取+项目介绍+运行文档)

    涉及技术 本项目核心技术采用 SpringBoot mybatis 前端 layui 开发工具 idea 数据库 mysql5 7 模版引擎采用的是 thymeleaf 安全框架采用 SpringSecurity 日志框架采用 logbac
  • vector的实现(c++)

    前言 vector是很重要的数据结构 所以了解它的底层的核心原理是很有必要的 如何了解它的底层原理呢 除了阅读原码外 自己实现一下vector的核心逻辑也是不错的选择 目录 1 四个默认成员函数 2 迭代器的实现 3 增删查改 4 容量相关
  • java金蝶星空云金蝶Java 对接 金蝶云星空 接口 对接 金蝶API 对接 金蝶 接口 解决 会话失效 问题 会话已失效,请重新登录

    java金蝶星空云金蝶Java 对接 金蝶云星空 接口 对接 金蝶API 对接 金蝶 接口 解决 会话失效 问题 会话已失效 请重新登录 1 准备工作 1 1 接口调用账户 1 2 下载 金蝶星空云 Java SDK 1 3 Maven项目
  • 由于现在工作环境不适合经常发博客,所以暂缓更新。

    好久没更新了 其实还有一些内容 不过目前没时间整理 后续争取补回 转载于 https www cnblogs com xianghang123 p 4908710 html
  • 【网络】UDP网络服务器

    代码的整体逻辑 UDP服务端 udpServer cc 服务端的调用 udpServer hpp 服务端的实现 UDP客户端 udpClient cc 客户端的调用 udpClient hpp 客户端的实现 1 udp服务端 服务端 1 初
  • 【用python写一个简易的消息轰炸代码】

    用python写一个简易的消息轰炸代码 前言 一 思路讲解 二 使用步骤 1 引入库 2 完整代码 总结 前言 有没有在qq 微信想用一句话不停怼一个人 这篇文章教你在回车能发送消息的一系列软件中 快速多次发送你想发的话 一 思路讲解 1
  • cocos2d-x学习笔记(持续更新)

    接受触屏事件的优先级是值越小 响应触屏事件的优先级越高 Z值越大 越外面 粒子系统设计工具 Particle Designer软件 目前只支持MAC平台 导出 plist文件 地图设计工具 Tiles 目前有两个版本 一个是Java版本 另
  • 免费的API

    https www jianshu com p e6f072839282 目前接口列表 新实时段子https api apiopen top getJoke page 1 count 2 type video 通过Id查段子https ap
  • VSCode无法登录leetcode,[ERROR] invalid password?

    VSCode无法登录leetcode 我使用的是 leetcode cn com 账户 选择的是第三方登录 github账号 v16 13 0 Active Name Version Desc solution discuss 2019 0
  • c语言常用算法归纳,C语言常用算法

    一 计数 求和 求阶乘等简单算法 此类问题都要使用循环 要注意根据问题确定循环变量的初值 终值或结束条件 更要注意用来表示计数 和 阶乘的变量的初值 例 用随机函数产生100个 0 99 范围内的随机整数 统计个位上的数字分别为1 2 3
  • pycharm配置监听端口0.0.0.0后不能在浏览器上通过本地地址访问

    解决方案 https segmentfault com q 1010000007625566参考方案 在settings py的ALLOWED HOSTS中添加 127 0 0 1 192 168 0 128 localhost 中间是本地
  • Jquery Ajax前后端交互技术

    Jquery Ajax前后端交互技术 1 什么是Ajax Ajax是一种异步 无刷新技术 什么是异步 1 现在我们大部分的请求都是同步 我必须接受你的请求给我返回结果了 我才能进行下一步操作 2 异步就是 无需返回服务器的结果 就可以继续做
  • 操作系统复习指南

    文章目录 前言 一 中断 1 中断的分类 2 硬中断和软中断 二 系统调用 1 什么是系统调用 三 进程 1 什么是进程 2 进程的组织方式 3 进程的特征 4 进程的几种状态及其转换 5 进程间的通信 6 进程的调度 7 作业调度算法 8
  • ua获取手机型号_如何根据 UA 判断手机型号和厂家?

    开门见山 拿下面2个 ua 来举例 Mozilla 5 0 Linux U Android 8 1 0 zh cn PBEM00 Build OPM1 171019 026 AppleWebKit 537 36 KHTML like Gec
  • idea中yml配置文件编写规范

    yaml文件实际是用YAML语言编写的 YAML简述 如下 1 语法特点 大小写敏感 通过缩进表示层级关系 禁止使用tab缩进 只能使用空格键 缩进的空格数据不重要 只要相同层级左对齐即可 使用 表示注释 2 yaml支持的数据结构有三种
  • 11,输出保留3位小数的浮点数

    读入一个浮点数 保留 3 位小数输出这个浮点数 输入格式 只有一行 一个浮点数 x 105 x 105 输出格式 也只有一行 保留 3 位小数的浮点数 输出时每行末尾的多余空格 不影响答案正确性 样例输入 12 34521 样例输出 12
  • MySQL几个问题:Column 'XXXX' in where clause is ambiguous,去除重复项,mybatis报错

    最近工作西街口 遇到MySQL Mybatis相关的几个问题 大概讲一下问题发生情况 解决办法和原因 一 Column create time in where clause is ambiguous 问题 这个不管你是在IDEA的控制台看
  • git查看远程仓库(git remote)

    实例 描述 git remote v 查看远程仓库地址 git remote show origin 查看远程仓库信息
  • 15. Canvas制作汽车油耗仪表盘

    1 说明 本篇文章在14 利用Canvas组件制作时钟的基础上进行一些更改 想查看全面的代码可以点击链接查看即可 效果展示 2 整体代码 import QtQuick 2 15 import QtQuick Controls 2 15 It