广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Qt自定义控件实现仪表盘
  • 854
分享到

Qt自定义控件实现仪表盘

2024-04-02 19:04:59 854人浏览 泡泡鱼
摘要

目录1.预览图2. 代码头文件源文件3. 用法1.预览图 2. 代码 头文件 #ifndef MOTORMETER_H #define MOTORMETER_H #include

1.预览图

2. 代码

头文件

#ifndef MOTORMETER_H
#define MOTORMETER_H

#include <QWidget>
#include <QDebug>
#include <QtMath>
#include <QDialog>
#include <QPainter>
#include <QPaintEvent>
#include <QPainterPath>
#include <QRadialGradient>

class motormeter : public QWidget
{
    Q_OBJECT
public:
    explicit motormeter(QWidget *parent = nullptr);
    ~motormeter();
protected:
    void paintEvent(QPaintEvent*);
private:
    int degRotate =-120;

private:
    void DrawPoint(QPainter&,int);
    void DrawDigital(QPainter&,int);
    void DrawCircle(QPainter&,int);
    void DrawSmallScale(QPainter&,int);
    void DrawBigScale(QPainter&,int);
    void DrawText(QPainter&,int);
    void DrawPointer(QPainter&,int);
    void drawIndicator(QPainter *painter);

public slots:
    void valueChanged(int);
};

#endif // MOTORMETER_H

源文件

#include "motormeter.h"

motormeter::motormeter(QWidget *parent) : QWidget(parent)
{
}

motormeter::~motormeter()
{

}

void motormeter::paintEvent(QPaintEvent*)
{

    QPainter painter(this);
    int width=this->width();
    int height=this->height();
    int radius=((width>height)?height:width)/2;
    //移动画笔到中下方
    painter.translate(width/2,height*0.6);
    //启用反锯齿
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(Qt::NoPen);
    //设置画刷颜色
    painter.setBrush(QColor(138,43,226));
    DrawPoint(painter,radius);
    DrawDigital(painter,radius-10);
    DrawCircle(painter,radius-35);
    DrawSmallScale(painter,radius-60);
    DrawBigScale(painter,radius-75);
    DrawText(painter,radius/2);
    DrawPointer(painter,radius-100);

}
//绘制外圈点
void motormeter::DrawPoint(QPainter& painter,int radius)
{
    //组装点的路径图
    QPainterPath pointPath;
    pointPath.moveTo(-2,-2);
    pointPath.lineTo(2,-2);
    pointPath.lineTo(2,2);
    pointPath.lineTo(0,4);
    pointPath.lineTo(-2,2);
    //绘制13个小点
    for(int i=0;i<13;++i){
        QPointF point(0,0);
        painter.save();
        painter.setBrush(QColor(255,127,80));
        //计算并移动绘图对象中心点
        point.setX(radius*qCos(((210-i*20)*M_PI)/180));
        point.setY(radius*qSin(((210-i*20)*M_PI)/180));
        //计算并移动绘图对象的中心点
        painter.translate(point.x(),-point.y());
        //计算并选择绘图对象坐标
        painter.rotate(-120+i*20);
        //绘制路径
        painter.drawPath(pointPath);
        painter.restore();
    }
}
//绘制外圈数字,原理和绘制圆圈点一样
void motormeter::DrawDigital(QPainter& painter,int radius)
{
    //设置画笔,画笔默认NOPEN
    painter.setPen(QColor(218,112,214));
    QFont font;
    font.setFamily("Cambria");
    font.setPointSize(15);
    painter.setFont(font);
    for(int i=0;i<13;++i){
        QPointF point(0,0);
        painter.save();
        point.setX(radius*qCos(((210-i*20)*M_PI)/180));
        point.setY(radius*qSin(((210-i*20)*M_PI)/180));
        painter.translate(point.x(),-point.y());
        painter.rotate(-120+i*20);
        painter.drawText(-15, -5, 40, 30,Qt::AlignCenter,QString::number(i*20));
        painter.restore();
    }
    //还原画笔
    painter.setPen(Qt::NoPen);
}
//绘制外圈
void motormeter::DrawCircle(QPainter& painter,int radius)
{
    //保存绘图对象
    painter.save();
    //计算大小圆路径
    QPainterPath outRing;
    QPainterPath inRing;
    outRing.moveTo(0,0);
    inRing.moveTo(0,0);
    outRing.arcTo(-radius,-radius, 2*radius,2*radius,-31,242);
    inRing.addEllipse(-radius+20,-radius+20,2*(radius-20),2*(radius-20));
    outRing.closeSubpath();
    //设置渐变色k
    QRadialGradient radialGradient(0,0,radius,0,0);
    radialGradient.setColorAt(0.93,QColor(138,43,226));
    radialGradient.setColorAt(1,QColor(0,0,0));
    //设置画刷
    painter.setBrush(radialGradient);
    //大圆减小圆
    painter.drawPath(outRing.subtracted(inRing));
    //painter.drawPath(outRing);
    //painter.drawPath(inRing);
    painter.restore();
}
//绘制刻度
void motormeter::DrawSmallScale(QPainter& painter,int radius)
{
    //组装点的路径图
    QPainterPath pointPath;
    pointPath.moveTo(-2,-2);
    pointPath.lineTo(-1,-4);
    pointPath.lineTo(1,-4);
    pointPath.lineTo(2,-2);
    pointPath.lineTo(1,8);
    pointPath.lineTo(-1,8);
    //绘制121个小点
    for(int i=0;i<121;++i){
        QPointF point(0,0);
        painter.save();
        point.setX(radius*qCos(((210-i*2)*M_PI)/180));
        point.setY(radius*qSin(((210-i*2)*M_PI)/180));
        painter.translate(point.x(),-point.y());
        painter.rotate(-120+i*2);
        if(i>=90) painter.setBrush(QColor(250,0,0));
        painter.drawPath(pointPath);
        painter.restore();
    }
}
//绘制刻度
void motormeter::DrawBigScale(QPainter& painter,int radius)
{
    //组装点的路径图
    QPainterPath pointPath1;
    pointPath1.moveTo(-2,-2);
    pointPath1.lineTo(-1,-4);
    pointPath1.lineTo(1,-4);
    pointPath1.lineTo(2,-2);
    pointPath1.lineTo(1,8);
    pointPath1.lineTo(-1,8);
    QPainterPath pointPath2;
    pointPath2.moveTo(-2,-2);
    pointPath2.lineTo(-1,-4);
    pointPath2.lineTo(1,-4);
    pointPath2.lineTo(2,-2);
    pointPath2.lineTo(1,15);
    pointPath2.lineTo(-1,15);
    //绘制25个刻度
    for(int i=0;i<25;++i){
        QPointF point(0,0);
        painter.save();
        point.setX(radius*qCos(((210-i*10)*M_PI)/180));
        point.setY(radius*qSin(((210-i*10)*M_PI)/180));
        painter.translate(point.x(),-point.y());
        painter.rotate(-120+i*10);
        if(i>=18) painter.setBrush(QColor(250,0,0));
        if(i%2){
            painter.drawPath(pointPath1);
        }
        else{
            painter.drawPath(pointPath2);
        }
        painter.restore();
    }
}
//绘制中心文字km/h
void motormeter::DrawText(QPainter& painter,int radius)
{
    painter.save();
    painter.setPen(QColor(153,51,250));
    QFont font;
    font.setFamily("Cambria");
    font.setPointSize(16);
    painter.setFont(font);
    painter.drawText(-25, -radius, 60, 30,Qt::AlignCenter,QString("km/h"));
    painter.restore();
}
//绘制指针
void motormeter::DrawPointer(QPainter& painter,int radius)
{
    //组装点的路径图
    QPainterPath pointPath;
    pointPath.moveTo(10,0);
    pointPath.lineTo(1,-radius);
    pointPath.lineTo(-1,-radius);
    pointPath.lineTo(-10,0);
    pointPath.arcTo(-10,0,20,20,180,180);
    QPainterPath inRing;
    inRing.addEllipse(-5,-5,10,10);
    painter.save();
    QRadialGradient radialGradient(0,0,radius,0,0);
    radialGradient.setColorAt(0,QColor(0,199,140,150));
    radialGradient.setColorAt(1,QColor(255,153,18,150));
    //计算并选择绘图对象坐标
    painter.rotate(degRotate);
    painter.setBrush(radialGradient);
    painter.drawPath(pointPath.subtracted(inRing));
    painter.restore();
}
void motormeter::valueChanged(int value)
{
    this->degRotate = value;
    update();
}

3. 用法

创建类,然后在创建的头文件和源文件里面添加上述代码

在UI界面里面拖拽widget部件

将widget部件提升为自定义的类,在提升的类名称里面填入上面源代码里面的类名

调用函数如下,在设计师界面类里面调用这个函数即可

void motormeter::valueChanged(int value)
{
    this->degRotate = value;
    update();
}
//设置背景墙
QPalette bgpal= palette();
bgpal.setColor(QPalette::Background,QColor(0,0,0));
setPalette (bgpal);
ui->motormeter->valueChanged(a);

以上就是Qt自定义控件实现仪表盘的详细内容,更多关于Qt仪表盘的资料请关注编程网其它相关文章!

--结束END--

本文标题: Qt自定义控件实现仪表盘

本文链接: https://www.lsjlt.com/news/138434.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Qt自定义控件实现仪表盘
    目录1.预览图2. 代码头文件源文件3. 用法1.预览图 2. 代码 头文件 #ifndef MOTORMETER_H #define MOTORMETER_H #include...
    99+
    2022-11-13
  • Qt如何实现仪表盘
    这篇文章主要介绍Qt如何实现仪表盘,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、前言仪表盘在很多汽车和物联网相关的系统中很常用,最直观的其实就是汽车仪表盘,这个以前主要是机械的仪表,现在逐步改成了智能的带屏带操作...
    99+
    2023-06-22
  • Qt编写自定义控件实现抽奖转盘
    本文实例为大家分享了Qt自定义控件实现抽奖转盘的具体代码,供大家参考,具体内容如下 #ifndef LOTTERYTURNTABLEWIDGET_H #define LOTTERYT...
    99+
    2022-11-13
  • Qt仪表盘的实现示例
    目录一、前言二、功能特点三、体验地址四、效果图五、相关代码一、前言 仪表盘在很多汽车和物联网相关的系统中很常用,最直观的其实就是汽车仪表盘,这个以前主要是机械的仪表,现在逐步改成了...
    99+
    2022-11-12
  • Qt如何编写自定义控件实现抽奖转盘
    本文小编为大家详细介绍“Qt如何编写自定义控件实现抽奖转盘”,内容详细,步骤清晰,细节处理妥当,希望这篇“Qt如何编写自定义控件实现抽奖转盘”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体代码如下#ifndef...
    99+
    2023-07-02
  • vue使用highcharts自定义仪表盘图表
    使用highchart图表框架实现一个自定义的类似下图的图表,供大家参考,具体内容如下 1. 原理 实际上就是4个饼图叠起来(可以这么理解),中间一个完整的圆和三个大小不一的圆圈 ...
    99+
    2022-11-13
  • Android实现仪表盘控件开发
    仪表盘在工业软件中很常见,今天整一个图片式仪表盘控件(非几何图形绘制)。实现非常简单,一张背景图,一张指针。创建一个RelativeLayout布局文件,然后在里面布置好控件的位置,...
    99+
    2022-11-12
  • android自定义可拖拽的仪表盘
    本文实例为大家分享了android自定义可拖拽的仪表盘的具体代码,供大家参考,具体内容如下 因为项目最近需要用到仪表盘,又不想使用之前使用的背景图的方式。主要是想自己写一点代码。觉得...
    99+
    2022-11-12
  • Android怎么自定义view实现科技感的仪表盘
    这篇文章主要讲解了“Android怎么自定义view实现科技感的仪表盘”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android怎么自定义view实现科技感的仪表盘”吧!效果图实现View...
    99+
    2023-06-04
  • Android自定义View制作仪表盘界面
    前言 最近我跟自定义View杠上了,甚至说有点上瘾到走火入魔了。身为菜鸟的我自然要查阅大量的资料,学习大神们的代码,这不,前两天正好在郭神在微信公众号里推送一片自定义控件的文章...
    99+
    2022-06-06
    仪表盘 view 界面 Android
  • 基于Qt实现可拖动自定义控件
    使用QT实现自定义类卡牌控件Card,使其能在父类窗口上使用鼠标进行拖动。 控件类头文件card.h #ifndef CARD_H #define CARD_H #include...
    99+
    2023-05-14
    Qt实现可拖动自定义控件 Qt 自定义控件 Qt控件
  • jquery插件实现仪表盘
    jquery插件实现仪表盘,供大家参考,具体内容如下 做了个简易的仪表盘,就是很常见的那种码表,实现没啥困难,就是需要算一点点位置 实现效果 代码部分 *{ margin: ...
    99+
    2022-11-12
  • 基于Qt怎么实现可拖动自定义控件
    本篇内容介绍了“基于Qt怎么实现可拖动自定义控件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用QT实现自定义类卡牌控件Card,使其能在...
    99+
    2023-07-05
  • Android自定义控件实现方向盘效果
    在很多开发中,为了界面更加的友好,在自定义View的基础上,开发者会开发出各种各样的自定义控件来满足实际开发需要,其中有一种”方向盘”的控件在实际开发中非常常见,便于用户进行一...
    99+
    2022-06-06
    Android
  • qt如何自定义可拖动控件
    要自定义可拖动的控件,可以按照以下步骤进行操作:1. 创建一个继承自QWidget或QFrame的自定义控件类,例如MyDragga...
    99+
    2023-10-10
    qt
  • Qt实现自定义验证码输入框控件的方法
    目录前言UI布局:页面样式初始化:功能实现:前言 本文实现了自定义的验证码输入框控件。控件包括图标、输入框、获取验证码按钮、验证码获取倒计时标签。支持鼠标点击获取验证码按钮后开始显示...
    99+
    2022-11-13
  • Android自定义View仿支付宝芝麻信用分仪表盘
    先看下iOS的芝麻信用分截图 这是我做的效果,还是有点差距的 支付宝9.9版本芝麻信用分的实现 首先初始化各种画笔,默认的size,padding,小圆点. (因为实...
    99+
    2022-06-06
    仪表盘 信用 view 支付宝 Android
  • WPF自定义控件的实现
    方式一:基于现有控件进行扩展,如基于button进行扩展,UI可直接用xmal进行编辑设计,逻辑用xaml.cs进行编辑 方法二:直接创建wpf自定义控件 本文用方法二开展自定义...
    99+
    2023-03-03
    WPF自定义控件
  • Android自定义控件(实现状态提示图表)
    前面分析那么多系统源码了,也该暂停下来休息一下,趁昨晚闲着看见一个有意思的需求就操练一下分析源码后的实例演练—-自定义控件。 这个实例很适合新手入门自定义控件。先看下效果图: ...
    99+
    2022-06-06
    Android
  • swift自定义表格控件(UITableView)
    本文实例为大家分享了swift自定义表格控件的具体代码,供大家参考,具体内容如下 1、效果图 2、控件 storyboard上的控件就2个:UIButton。 3、为按钮添加点击事...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作