图形绘制-仪表盘(2)

本章节我们介绍如何如何绘制刻度对应的数字及指针。效果如下:

关于通过继承重写QWidget的绘制事件paintEvent(),来绘制仪表盘的基础操作,请看上一章节《图形绘制-仪表盘(1)-CSDN博客》介绍。

在paintEvent()中继续写以下代码:

//保存和还原QPainter对象的状态 恢复到之前保存的状态,确保不影响其他绘图操作

painter.restore();

painter.save();

/*绘制刻度*/

painter.rotate(m_startAngle);//将坐标系顺时针旋转150°,到达起始位置

QPen penScale(Qt::blue);

painter.setPen(penScale);

int step = (m_maxSpeed - m_minSpeed) / (5*m_nultiple);

double angleStep = (360.0 - (m_startAngle - m_endAngle)) / step;

for (int i = m_minSpeed; i

{

if (i >= (100*m_nultiple)){ //绘制红色

penScale.setColor(Qt::red);

painter.setPen(penScale);

}

if (i % (25*m_nultiple) == 0){//粗线

penScale.setWidth(2);

painter.setPen(penScale);

painter.drawLine(94,0,82,0);

}else if (i % (10*m_nultiple) == 0){//中等

penScale.setWidth(1);

painter.setPen(penScale);

painter.drawLine(94,0,84,0);

}else if (i % (5*m_nultiple) == 0){ //短线

penScale.setWidth(0);

painter.setPen(penScale);

painter.drawLine(90,0,86,0);

}

painter.rotate(angleStep); //将坐标系顺时针旋转12°

}

//保存和还原QPainter对象的状态 恢复到之前保存的状态,确保不影响其他绘图操作

painter.restore();

painter.save();

/*绘制数字刻度*/

//数字刻度颜色

painter.setPen(QColor(120, 185, 255));

//数字刻度字体大小粗细

QFont font;

font.setPointSize(12);

font.setBold(true);

painter.setFont(font);

//获取字体的度量信息 以便在绘制文本时进行准确的布局和位置计算

QFontMetricsF fm(font);

//绘制数字刻度

double x,y;

double angle, angleArc;

double w,h;

//25的倍数 显示数字刻度

for (int i = m_minSpeed; i

{

angle = 360 - (m_startAngle + (i - m_minSpeed) * m_anglePerVel); //角度

angleArc = angle * 3.14 / 180; //转换为弧度

x = 65 * cos(angleArc);

y = -65 * sin(angleArc);

if (i % (25*m_nultiple) == 0)

{

w = fm.width(QString::number(i));

h = fm.height();

painter.drawText(QPointF(x - w / 2,y + h/4),QString::number(i));

}

}

//保存和还原QPainter对象的状态 恢复到之前保存的状态,确保不影响其他绘图操作

painter.restore();

painter.save();

/*绘制指针*/

//指针对应的角度

double curAngle = m_startAngle + (m_curSpeed-m_minSpeed )* m_anglePerVel;

painter.rotate(m_startAngle); //旋转坐标系

painter.setPen(QColor(120, 185, 255)); //颜色

painter.setBrush(QColor(120, 185, 255));//指针形状填充后的颜色

static const QPointF points[3] = {

QPointF(0.0, 4),

QPointF(0.0, -4),

QPointF(80.0, 0),

};

painter.drawPolygon(points,3); //绘制指针形状

//保存和还原QPainter对象的状态 恢复到之前保存的状态,确保不影响其他绘图操作

painter.restore();

painter.save();

/*绘制指针根件的中心圆*/

QRadialGradient rg(0,0,10,0,0);

rg.setColorAt(0.4,Qt::darkGray);

rg.setColorAt(0.5,Qt::white);

rg.setColorAt(1.0,Qt::darkGray);

painter.setPen(Qt::NoPen);

painter.setBrush(rg);

painter.drawEllipse(QPoint(0,0),10,10);

//保存和还原QPainter对象的状态 恢复到之前保存的状态,确保不影响其他绘图操作

painter.restore();

painter.save();

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

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

相关文章

【JAVE SE】---运算符和程序逻辑控制语句

1.运算符 算数运算符 - * / % 注意:1.Java的%符号左右两边可以是小数,也可以是负数 //运算符float a1.0f;float b2.0f;float c-1.5f;System.out.println(a%b); //1.0System.out.println(a%c); //1.0 2.Java中除数不可以为0&#xff0c…

一些著名的软件都用什么语言编写?

1、操作系统 Microsoft Windows :汇编 -> C -> C 备注:曾经在智能手机的操作系统(Windows Mobile)考虑掺点C#写的程序,比如软键盘,结果因为写出来的程序太慢,实在无法和别的模块合并&…

前端实现弹小球功能

这篇文章将会做弹小球游戏,弹小球游戏大家小时候都玩过,玩家需要在小球到达游戏区域底部时候控制砖块去承接小球,并不断的将小球弹出去。 首先看一下实现的效果。 效果演示 玩家需要通过控制鼠标来实现砖块的移动,保证在小球下落…

burp靶场--CSRF

burp靶场–CSRF https://portswigger.net/web-security/csrf#what-is-csrf ### 什么是 CSRF? 跨站请求伪造(也称为 CSRF)是一种 Web 安全漏洞,允许攻击者诱导用户执行他们不打算执行的操作。它允许攻击者部分规避同源策略&#…

xcode安装visionOS Simulator模拟器报错解决方法手动安装方法

手动安装方法: 手动下载visionOS Simulator模拟器地址: https://developer.apple.com/download/all/ 选择 Xcode 版本 sudo xcode-select -s /Applications/Xcode.app # 用 Xcode-beta 的话是: # xcode-select -s /Applications/Xcode-beta…

【ArcGIS微课1000例】0098:查询河流流经过的格网

本实验讲述,ArcGIS中查询河流流经过的格网,如黄河流经过的格网、县城、乡镇、省份等。 文章目录 一、加载数据二、空间查询三、结果导出四、注意事项一、加载数据 加载实验配套数据0098.rar中的河流(黄河)和格网数据,如下图所示: 接下来,将查询河流流经过的格网有哪些并…

3338 蓝桥杯 wyz的数组IV 简单

3338 蓝桥杯 wyz的数组IV 简单 //C风格解法1&#xff0c;通过率50% #include<bits/stdc.h>int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int n; std::cin >> n;int ans 0;std::vector<int>a(n);for(auto &am…

Java语言名字由来

文章目录 一、1990年代初Java雏形初诞生&#xff0c;第一个名称是Greentalk二、创始人办公室前有棵橡树&#xff0c;后来改名叫“oak&#xff08;橡树&#xff09;”三、在家电行业失败进入互联网行业&#xff0c;发现商标被抢注被迫换名四、创始团队成员在喝咖啡时灵机一动&am…

Mysql-ReadView + MVCC-RR 与 RC

实验准备 创建脚本 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(16) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,age int(11) NULL DEFAULT NULL,addr varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,PRIMARY …

双非本科准备秋招(9.3)—— JVM2

学这个JVM还是挺抽象的&#xff0c;不理解的东西我尽量记忆了&#xff0c;毕竟刚接触两天&#xff0c;也没遇到过实际应用场景&#xff0c;所以学起来还是挺费劲的&#xff0c;明天再补完垃圾回收这块的知识点。U•ェ•*U 先补一下JVM运行时的栈帧结构。 线程调用一个方法的执…

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现SPI控制OLED屏幕

上一篇&#xff1a; [嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 [嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集 [嵌入式软件][启蒙篇][仿真平台]STM32F103实现定时器 [嵌入式软件][启蒙篇][仿真平台] STM32F103实现IIC控制OLED屏幕 文章目…

LabVIEW探测器CAN总线系统

介绍了一个基于FPGA和LabVIEW的CAN总线通信系统&#xff0c;该系统专为与各单机进行系统联调测试而设计。通过设计FPGA的CAN总线功能模块和USB功能模块&#xff0c;以及利用LabVIEW开发的上位机程序&#xff0c;系统成功实现了CAN总线信息的收发、存储、解析及显示功能。测试结…