【QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结】

news2024/9/22 21:36:30

【QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结】

  • 1、概述
  • 2、实验环境
  • 3、参考资料-致谢
  • 4、自我提升+实验效果
  • 5、代码练习-学习后拆解
      • (1)头文件部分
      • (2)绘制事件+绘制表盘代码
      • (3) 每一块部分绘制
  • 6、代码移植=提升类
      • (1)布局控件
      • (2)提升类细节
      • (3)多个表盘设置值与代码设置值
  • 7、本次实验样例代码
  • 8、实验细节
  • 9、总结

1、概述

最近因为要使用QT写个带表盘的界面,在上网找了相关资料后,质量其实有些参差不齐的,有的看的云里雾里的,有的也只是贴出来代码,真正执行起来时,对于我这种新手来说,还是有点莫不到头脑的。

所以我写文章习惯性将所有步骤罗列,将细节说明,也是因为整个流程大量细节,只要按照步骤来,一般能达到效果,但是如果你是针对某个问题感兴趣,那么整篇文章对你来说,文字又有点多,真是难以取舍文字应该写多写少啊~~!

2、实验环境

实验环境还是挺重要的,因为有时候,在你电脑上能运行的东西,在别人的电脑就不一定能运行,这一部分的原因就可能是实验版本不一样。
系统环境:window环境
QT软件版本:qt 5.14.2
在这里插入图片描述

3、参考资料-致谢

(1)上上周刚刚练习完的代码,这位博主写的不多,但是跟着练习完代码后,觉得代码仪表写的不错,我也是照着他这份代码进行练习的,这里肯定要说下的。

参考连接:https://blog.csdn.net/wojiaoanchao/article/details/104068188
在这里插入图片描述

(2)也尝试过过去其它样例代码,但是因效果,感觉不是很好,移植后指针老不在中心位置,也是自己开始很菜,尝试了很多方式调正都没有成功,所以后来就没有使用,不过对自己学习还是有帮助,还是觉定说下。

参考资料:https://www.voycn.com/article/qtzidingyiwidgetzhiyibiaopan
在这里插入图片描述

4、自我提升+实验效果

我自己跟着代码练习一遍,然后再输出出来,通过自己理解,复制了一个表盘,并且跟学习,总是要有些提高的,会讲有提升类相关的东西,并且尽量说清楚操作步骤。

实验效果如下
在这里插入图片描述

5、代码练习-学习后拆解

(1)头文件部分

这块是练习第一部分,建立一个空的例程后,添加新文件,如下图。
在这里插入图片描述
注意>>>从上图可以看到,虽然我们建立输入类名叫“GradientMeter”,但是文件名字分别是“gradientmeter.cpp”和"gradientmeter.h",两个都是小写的名字,但是提升类是,需要输入“GradientMeter”。

#ifndef GRADIENTMETER_H
#define GRADIENTMETER_H

#include <QWidget>
#include <QPropertyAnimation>

class GradientMeter : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(double value READ getValue WRITE setValue)
    Q_PROPERTY(int hShearValue READ getHShearValue WRITE setHShearValue)
    Q_PROPERTY(int vShearValue READ getVShearValue WRITE setVShearValue)
    Q_PROPERTY(double radiusInner READ getRadiusInner WRITE setRadiusInner)
    Q_PROPERTY(double radiusOuter READ getRadiusOuter WRITE setRadiusOuter)
    Q_PROPERTY(double radiusHalo READ getRadiusHalo WRITE setRadiusHalo)
    Q_PROPERTY(QColor colorQuterFrame READ getColorOuterFrame WRITE setColorOuterFrame)
    Q_PROPERTY(QColor colorInnerStart READ getColorInnerStart WRITE setColorInnerStart)
    Q_PROPERTY(QColor colorInnerEnd READ getColorInnerStart WRITE setColorInnerEnd)

    Q_PROPERTY(QColor colorOuterStart READ getColorOuterStart WRITE setColorOuterStart)
    Q_PROPERTY(QColor colorOuterEnd READ getColorOuterEnd WRITE setColorOuterEnd)
    Q_PROPERTY(QColor colorHaloStart READ getColorHaloStart WRITE setColorHaloStart)
    Q_PROPERTY(QColor colorHaloEnd READ getColorHaloEnd WRITE setColorHaloEnd)

public:
    explicit GradientMeter(QWidget *parent = nullptr);
    ~GradientMeter();

protected:
    void paintEvent(QPaintEvent *event);

public:

    GradientMeter();

private:
    void drawOuterGradient(QPainter *painter);
    void drawInnerGradient(QPainter *painter);
    void drawOuterHalo(QPainter *painter);
    void drawScale(QPainter *painter);
    void drawScaleNum(QPainter *painter);
    void drawPointer(QPainter *painter);
    void drawPointerSector(QPainter *painter);
    void drawValue(QPainter *painter);
    void drawUnit(QPainter *painter);

private:
    double value;               //目标值
    int hShearValue,vShearValue;//H、V扭曲值
    double radiusInner;         //渐变内圈外径
    double radiusOuter;         //渐变外圈内径
    double radiusHalo;          //光晕内半径
    QColor colorOuterFrame;     //表盘外边框压缩
    QColor colorInnerStart;     //渐变内圈起始颜色
    QColor colorInnerEnd;       //渐变内圈结束颜色
    QColor colorOuterStart;     //渐变外圈起始颜色
    QColor colorOuterEnd;       //渐变外圈结束颜色
    QColor colorHaloStart;      //光晕起始颜色
    QColor colorHaloEnd;        //光晕结束颜色

    QPropertyAnimation *hShearAnimation,*vShearAnimation;
public:
    double  getValue()           const;
    int     getHShearValue()     const;
    int     getVShearValue()     const;
    double  getRadiusInner()     const;
    double  getRadiusOuter()     const;
    double  getRadiusHalo()      const;

    QColor  getColorOuterFrame() const;
    QColor  getColorInnerStart() const;
    QColor  getColorInnerEnd()   const;
    QColor  getColorOuterStart() const;
    QColor  getColorOuterEnd()   const;
    QColor  getColorHaloStart()  const;
    QColor  getColorHaloEnd()    const;

    void setValue(int value);
    void setValue(double value);
    void setHShearValue(int value);
    void setVShearValue(int value);

    //表盘外边框颜色
    void  setColorOuterFrame(QColor color);
    //内层渐变区半径
    void setRadiusInner(int radius);
    void setRadiusInner(double radius);
    //外层渐变区半径
    void setRadiusOuter(int radius);
    void setRadiusOuter(double radius);

    //外出光晕区半径
    void setRadiusHalo(int radius);
    void setRadiusHalo(double radius);
    //内层渐变颜色
    void setColorInnerStart(QColor color);
    void setColorInnerEnd(QColor color);
    //外出渐变颜色
    void setColorOuterStart(QColor color);
    void setColorOuterEnd(QColor color);
    //光晕颜色
    void setColorHaloStart(QColor color);
    void setColorHaloEnd(QColor color);

    void startShearAnimal(int duraiton,int hShearValue,int vShearValue);

public slots:
    void updateValue(double value);
};

#endif // GRADIENTMETER_H

然后在"gradientmeter.h",我先手敲相关代码,为什么先练这部分?因为这部分,可以让你对全局函数有个相关框架认识。知道有什么函数以及相关变量声明。

(2)绘制事件+绘制表盘代码

之后是练习"gradientmeter.cpp"内相关代码,也是跟着编写完这块,对整个绘制有了框架的认识,如下图,可以明白,绘制表盘其实是一部分一部分绘制,每次绘制完成后,保存下,这下之前文章有提到练习绘制的那片文章就派上用场,有了地基,很多东西也就能看懂了。

之前铺垫文章:【QT 5 学习笔记-学习绘图相关+画线图形等+绘图事件+基础学习(1)】
之前铺垫文章:【QT 5 学习笔记-学习绘图相关+画图形图片等+绘图设备+基础学习(2)】

这部分主要代码:

void GradientMeter::paintEvent(QPaintEvent *event)
{
    int width = this->width();
    int height= this->height();
    int side = qMin(width,height);

    //绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing);
    painter.translate(width/2,height/2);
    painter.scale(side/200.0,side/200.0);

    painter.shear(double(hShearValue/100.0f),double(vShearValue/100.0f));

    //内层渐变
    drawInnerGradient(&painter);

    //外层渐变
    drawOuterGradient(&painter);

    //外层光晕
    drawOuterHalo(&painter);

    //刻度线
    drawScale(&painter);

    //刻度值
    drawScaleNum(&painter);

    //绘制指针
    drawPointer(&painter);

    //绘制扇形区域
    drawPointerSector(&painter);

    //绘制值
    drawValue(&painter);

    //绘制单位
    drawUnit(&painter);
}

(3) 每一块部分绘制

在这里插入图片描述

那么接下来就是每个函数单独编写了,针对每个单独函数,我们需要了解到底是怎么画出来,就拿
第一个内次渐变来说,其实有点点像,先画个渐变颜色的圆,然后扣去一部分,对于整个仪表,一眼望过去,我们其实很难下手,不知道改真没做,但是反过来,使用基础图形一点点组起来,我们就很容易理解了。

//第三遍开始理解,是画了两个圆,大圆减去小圆
void GradientMeter::drawOuterHalo(QPainter *painter)
{
    painter->save();
    painter->setPen(Qt::NoPen);

    QPainterPath smallCircle;
    QPainterPath bigCircle;

    float radius = radiusHalo;
    smallCircle.addEllipse(-radius,-radius,radius * 2,radius * 2);
    radius+=(100.0-radiusHalo);
    bigCircle.addEllipse(-radius,-radius,radius * 2,radius * 2 );

    //大圆刨去小圆部分
    QPainterPath gradientPath = bigCircle - smallCircle;
    QRadialGradient gradient(0,0,100,0,0);
    gradient.setSpread(QGradient::ReflectSpread);

    gradient.setColorAt(radiusHalo/100,colorHaloStart);
    gradient.setColorAt(1,colorHaloEnd);
    painter->setBrush(gradient);
    painter->drawPath(gradientPath);

    painter->restore();

}

6、代码移植=提升类

这个demo样例大概500多行代码,我觉得这已经非常少了,还是非常值得练习一下的。
到这里,认为代码部分就练习完毕了。

(1)布局控件

这篇文章还是有点高度,不是面对纯新手,基础的布局,会说下,但不会事无巨细,其实也可以看下面工程代码。
1)框架布局
在这里插入图片描述
2)设置滑动条范围
在这里插入图片描述

(2)提升类细节

1)控件选择提升类
在这里插入图片描述
2)输入需要提升类的名字,这里之前已经有了,直接选择就行。
在这里插入图片描述
这里需要注意的是,提升类的名称和类名一样,而不是文件名字一样。
在这里插入图片描述

(3)多个表盘设置值与代码设置值

因为我当时用了两个表盘,当时就有疑问,当我有两个以上表盘时,如何知道设置的是哪个值,该任何设置呢,这里其实因为提升类,相当这个控件能继承这个提升类,简单说,通过这个控件调用相关方法。
1)我们选择滑动条控件,转到槽
在这里插入图片描述
2)然后选择只要值改变,就触发这个槽函数
在这里插入图片描述
在这个函数里加入相关代码,控制表盘转动。

在这里插入图片描述
如上图这里通过控件就很好区分开了。

加完后,就可以运行,看相关结果了。

7、本次实验样例代码

样例代码:https://download.csdn.net/download/qq_22146161/87442462

8、实验细节

(1)表盘遇到问题,缩放与扩大时指针无法在中心。
在这里插入图片描述

我最开始其实跟着“3、参考资料-致谢”里面第二个样例学习的,但是移植后,发现表针总是不在中心,后续尝试了很多办法吧,都没能很好解决,所以才使用第一个样例。
(2)文字显示不全问题,或者没有一部分问题
在这里插入图片描述

如下图所示,当时移植文字没有显示全,这块中间垫一块东西就可以了。
在这里插入图片描述
(3)文字在不同分辨率屏幕显示不一样
这点经常遇到,自己暂时没有好的办法,一般都是根据要使用的屏幕进行适配,因为我这共有两个屏幕,分辨率又不一样,所以在一个屏幕上显示可以了,在另一个块,不一样可以如下图。

在这里插入图片描述
(4)代码打错,导致报相关不知道错误。
类似如下,大部分情况下,都是自己手敲代码错了,需要核对代码。
在这里插入图片描述

9、总结

整体看表盘,让我们去实现时,真的很难下手,不知道应该怎么去做,但是反过来,以组装的形式,将表盘拆解,我们就能窥探其精妙。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Security in Action 第十一章 SpringSecurity前后端分离实战

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;以实战为线索&#xff0c;逐步深入SpringSecurity相关知识相关知识&#xff0c;打造完整的SpringSecurity学习步骤&#xff0c;提升工程化编码能力和思维能力&#xff0c;写出高质量代码。希望大家都能够从中有所收获&#…

nginx正向代理的配置和使用

nginx正向代理的配置和使用 nginx正向代理的配置和使用nginx正向代理的配置和使用安装包准备下载nginx安装包下载正向代理模块的包版本与模块对照表部署nginx服务上传nginx包和正向模块包解压,改名安装nginx配置正向代理创建nginx用户检查nginx配置并启动nginx服务所在服务器验…

微服务02 Docker

Docker实用篇0.学习目标1.初识Docker1.1.什么是Docker微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0…

实战绕过WTS-WAF的SQL注入

实战绕过WTS-WAF的SQL注入1.前言2.测试流程2.1.发现漏洞2.1.1.正常页面2.1.2.WAF警告2.1.3.非正常页面2.2.判断字段数2.2.1.非正常页面2.2.2.正常页面2.3.判断回显位2.4.信息收集2.4.1.数据库版本2.4.2.数据库名2.5.判断数据库表2.5.1.WAF告警2.5.2.获取表2.5.3.burp suite测试…

龙曲良 Tensorflow —— tensorflow高级操作(自用)

目录 一、合并与分割 1.1 tf.concat (合并) 1.2 tf.stack &#xff08;增加新维度&#xff09; 1.3 tf.unstack &#xff08;一个一个拆分&#xff09; 1.4 tf.split &#xff08;均分拆分&#xff09; 二、数据统计 2.1 tf.norm&#xff08;默认二范数&#xff09; 2…

WebRTC(一):三种架构和基本原理

文章目录一、三种架构二、为什么SFU最为常用&#xff1f;一、三种架构 webrtc大致可以分为三种架构&#xff1a; MESH mesh架构需要所有参与连接的peer简历和所有其他peer的媒体的连接&#xff0c;如图一。 该架构需要n-1个上下行&#xff0c;以此带来的带宽消耗&#xff08…

家政服务小程序实战教程02-创建模型应用

我们在上一篇中介绍了数据源的设计及创建方法&#xff0c;本篇我们就根据我们创建好的数据源来设计功能。 按我们的需求分析&#xff0c;系统管理员来审核数据&#xff0c;要想审核数据需要给管理员提供一个管理后台。微搭中的管理后台是通过模型应用来解决的。 登录控制台&a…

我用python/C++调用ChatGPT自制了一个聊天机器人

目录1 ChatGPT完整版2 Python/C调用ChatGPT2.1 获取API秘钥2.2 测试API功能2.3 设计简单UI3 聊天问答1 ChatGPT完整版 2015年&#xff0c;OpenAI由马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始人彼得蒂尔等硅谷科技大亨创立&#xff0c;公…

chatGPT都可以干什么呢?来一睹风采 (送账号)

文章目录1. 写代码2. 写文案3. 写剧本4. 写歌诗5. 写报告6. 查公式7. 写对联8. 写文章9. 做表格10. 做计划11. 等等1. 写代码 2. 写文案 3. 写剧本 4. 写歌诗 5. 写报告 这妥妥的翻译文&#xff0c;数据完全不对。 6. 查公式 傅里叶变换的时域性质有如下几点&#xff1a; 对…

JAVA集合专题4 —— Map

目录Map接口实现类的特点Map接口的常见方法Map六大遍历方式Map练习1code编程练习2code编程练习3思路codeMap接口实现类的特点 Map与Collection并列存在&#xff0c;是Map集合体系的顶级接口Map的有些子实现存储数据是有序的(LinkedHashMap)&#xff0c;有些子实现存储数据是无…

【量化交易】 量化因子 动量类因子

量化因子 - 风险类因子计算 5日乖离率 BIAS5 &#xff08;收盘价-收盘价的N日简单平均&#xff09;/ 收盘价的N日简单平均*100&#xff0c;在此n取5 60日变动速率&#xff08;Price Rate of Change&#xff09; ROC60 ①AX今天的收盘价—20天前的收盘价 ②BX60天前的收盘价 ③…

React-Router

版本5安装&#xff1a;npmnpm install react-router-dom5 -Syarnyarn add react-router-dom5import ReactDOM from "react-dom/client";// react router适用于web和原生项目&#xff0c;我们在web项目中使用&#xff0c;所以需要引入的包是react-router-dom import {…

Idea 安装 Sonar 插件提升代码质量

目录 0. 环境说明 1. Sonar 简介 2. IDEA 配置 Sonar 0. 环境说明 Java 1.8IDEA 2022.3.1SonarLint 7.4.0 1. Sonar 简介 在多人协通的软件开发过程中&#xff0c;代码风格和代码质量对于软件的整体交付是十分关键的。这时我们可以利用 Sonar 插件&#xff0c;对代码进行扫描…

Spring MVC注解Controller源码流程解析--HandlerAdapter执行流程--上

Spring MVC注解Controller源码流程解析--HandlerAdapter执行流程--上引言RequestMappingHandlerAdapter方法参数解析器方法参数名解析器类型转换体系简单的使用演示数据绑定器工厂定制化修改DataBinder获取泛型参数ControllerAdvice与InitBinder注解控制器方法执行流程Controll…

C语言(可变参数:stdarg.h)

目录 一.使用可变参数 1.提供一个使用省略号的函数原型 2.在函数定义中创建一个va_list类型的变量 3.用宏把该变量初始化为一个参数列表 4.用宏访问参数列表 5.使用宏完成清理工作 二.va_copy 三.实例 一.使用可变参数 该头文件提供类似接受可变数量参数的宏&#xf…

【招聘】永善县正向社会工作服务中心招聘2名工作人员

永善县正向社会工作服务中心面向社会公开招聘2名工作人员 永善县正向社会工作服务中心是2019年9月在永善县民政局注册登记成立的民办非企业单位。业务范围主要为&#xff1a;面向社会提供各类专业社工服务&#xff0c;开展活动策划、个案援助等社会服务项目&#xff1b;承接个人…

基于WEB的小型公司人事管理系统设计

技术&#xff1a;Java、JSP等摘要&#xff1a;随着当代各类企业公司员工数量越来越多、分工越来越细化、各行各业之间的联系越发密切&#xff0c;对人事管理的要求也不断提高。实现企业人事管理计算机化&#xff0c;毫无疑问会让企业的人事管理变得更加高效化和智能化。企业要生…

c/c++开发,无可避免的函数参数实践

一、函数参数表 函数由函数名以及一组操作数类型唯一地表示。函数的操作数&#xff0c;也即形参&#xff0c;在一对圆括号中声明&#xff0c;形参与形参之间以逗号分隔。每一个函数都有一个相关联的返回类型。 int setval(int val) {//函数体 }; 这里&#xff0c;定义了一个名…

Vulkan教程(14): Graphics pipeline之Fixed functions(固定管线功能)

Vulkan官方英文原文&#xff1a;https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Fixed_functions对应的Vulkan技术规格说明书版本&#xff1a; Vulkan 1.3.2The older graphics APIs provided default state for most of the stages of the graphic…

个人如何获得免费的VMware Fusion Player?在macOS上虚拟化系统

不管是开发还是测试&#xff0c;有时候都需要虚拟机。比如虚拟化一台Linux&#xff0c;部署Web服务进行服务器仿真操作。亦或者&#xff0c;macOS上虚拟化Windows&#xff0c;进行Windows环境模拟。 VMware这家公司&#xff0c;大家应该都比较熟悉。旗下的VMware Workstation在…