QT小控件-仪表盘


前言

具体使用说明见:https://blog.csdn.net/qq_39641107/article/details/121250077?spm=1001.2014.3001.5501
示意图:
请添加图片描述

一、程序代码如下:

wbgaugeone.pri:

HEADERS += wbgaugeone.h
SOURCES += wbgaugeone.cpp

wbgaugeone.h:

#ifndef WBGAUGEONE_H
#define WBGAUGEONE_H

#include <QWidget>
#include <math.h>
#include <QPainter>
#include <QtCore>
#include <QFontMetrics>
class WBgaugeone : public QWidget
{
    Q_OBJECT

public:
    WBgaugeone(QWidget *parent = 0);
    void setpointer_number(int pointer);//设置指针指向0-60
    void setcolorarc(QColor rarc);  //最外层圆弧颜色
    void setcolorarc2(QColor rarc2); //中心圆渐变色起点颜色
    void setcolornumber(QColor number); //数字颜色
    void setcolorline(QColor line); //度量标直线颜色
    void setcolorlips(QColor lips);//圆的终点颜色
    void setcolorpointer(QColor pointer);//指针颜色
private:
    QColor colorarc;//弧线颜色
    QColor colorarc2;//弧线颜色2
    QColor colornumber;//数字颜色
    QColor colorline;//直线颜色
    QColor colorelips;//圆颜色
    QColor colorpointer;//指针颜色
    QPen pen;//线
    QBrush brush;//刷子
    QRect rect;//视口
    int x, y;
    int pointer_number; //0-60
protected:
    void paintEvent(QPaintEvent *);
    void wbcircleEquation(int r, double j);
    void wbdrawArc(QPainter *painter);//画弧线
    void wbdrawNumber(QPainter *painter, QString numberstr,int x, int y);//画数字
    void wbdrawLine(QPainter *painter, int linewidth,int x1, int y1, int x2, int y2);//画直线
    void wbdrawEllips(QPainter *painter);//画圆
    void wbdrawPointer(QPainter *painter, int x1,int y1, int x2,int y2, int x3, int y3);//画指针

};

#endif // WBGAUGEONE_H

wbgaugeone.cpp:

#include "wbgaugeone.h"

WBgaugeone::WBgaugeone(QWidget *parent) :
    QWidget(parent)
{
    colorarc = Qt::black;//弧线颜色
    colorarc2 =  Qt::white;//弧线颜色2
    colornumber =Qt::red;//数字颜色
    colorline = Qt::black;//直线颜色
    colorelips = Qt::blue;//圆颜色
    colorpointer = Qt::blue;//指针颜色
    pointer_number = 0;
    this->repaint();
}
void WBgaugeone::wbcircleEquation(int r ,double j)//根据x坐标获得圆的y坐标,sign判断y的正负性
{
    double val = 3.14159265 / 180;
    if (j>180)
    {
        x = -int(r*fabs(cos(val*j)));
        y = int(r*fabs(sin(val*j)));
    }
    else if (j<=180 && j>90)
    {
        x = -int(r*fabs(cos(val*j)));
        y = -int(r*fabs(sin(val*j)));
    }
    else if (j<=90 && j>0)
    {
        x = int(r*fabs(cos(val*j)));
        y = -int(r*fabs(sin(val*j)));
    }
    else
    {
        x = int(r*fabs(cos(val*j)));
        y = int(r*fabs(sin(val*j)));
    }
}
void WBgaugeone::wbdrawArc(QPainter *painter)//画弧线
{
    pen = QPen();
    pen.setWidth(25);//25
    pen.setColor(colorarc);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::RoundCap);
    pen.setJoinStyle(Qt::BevelJoin);
    painter->setPen(pen);
    painter->save();
    painter->translate(250,250);
    rect.setRect(-235,-235,470,470);
    painter->drawArc(rect,-45*16,270*16);
    painter->restore();

}
void WBgaugeone::wbdrawNumber(QPainter *painter, QString numberstr,int x, int y)//画数字
{
    QFont font;
    font.setFamily("微软雅黑");//字体
//    font.setPixelSize(25);//文字像素大小
    font.setPointSize(25);//文字大小
//    QFontMetrics textsize = QFontMetrics(font);
//    QRect textrect = QRect(textsize.boundingRect(numberstr));
    painter->setFont(font);
    int widthofTitle = painter->fontMetrics().width(numberstr);//字符串显示的像素大小
    int heightofTitle = painter->fontMetrics().height();
    pen = QPen();
    pen.setWidth(3);//3
    pen.setColor(colornumber);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::FlatCap);
    pen.setJoinStyle(Qt::BevelJoin);
    painter->setPen(pen);
    painter->save();
    painter->translate(250,250);

    painter->drawText(x-widthofTitle/2,y+heightofTitle/4,numberstr);
    painter->restore();
}
void WBgaugeone::wbdrawLine(QPainter *painter, int linewidth,int x1, int y1,int x2, int y2)//画直线
{
    pen = QPen();
    pen.setWidth(linewidth);
    pen.setColor(colorline);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::RoundCap);
    pen.setJoinStyle(Qt::BevelJoin);
    painter->setPen(pen);
    painter->save();
    painter->translate(250,250);
    painter->drawLine(x1,y1,x2,y2);
    painter->restore();

}
void WBgaugeone::wbdrawEllips(QPainter *painter)//画圆
{
    pen = QPen();
    pen.setWidth(2);//25
    pen.setColor(colorelips);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::RoundCap);
    pen.setJoinStyle(Qt::BevelJoin);
    painter->setPen(pen);
//    brush = QBrush();
//    brush.setColor(colorelips);
//    brush.setStyle(Qt::SolidPattern);
//    painter->setBrush(brush);
    rect.setRect(-25,-25,50,50);
    QRadialGradient radial = QRadialGradient(0,0,25,0,0);
    radial.setColorAt(0,colorarc2);
    radial.setColorAt(1,colorelips);
    painter->save();
    painter->translate(250,250);
    painter->setBrush(radial);
    painter->drawEllipse(rect);
    painter->restore();
}
void WBgaugeone::wbdrawPointer(QPainter *painter,int x1,int y1, int x2,int y2, int x3, int y3)//画指针
{
    pen = QPen();
    pen.setWidth(1);//25
    pen.setColor(colorpointer);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::RoundCap);
    pen.setJoinStyle(Qt::BevelJoin);
    painter->setPen(pen);
    brush = QBrush();
    brush.setColor(colorpointer);
    brush.setStyle(Qt::SolidPattern);
    painter->setBrush(brush);
    painter->save();
    painter->translate(250,250);
    painter->drawPolygon(QPolygon({QPoint(x1,y1),QPoint(x2,y2),QPoint(x3,y3)}));
    painter->restore();
}
void WBgaugeone::paintEvent(QPaintEvent *)//绘制
{
    QPainter wbpainter(this);
    wbpainter.setRenderHint(QPainter::Antialiasing);
    wbpainter.setRenderHint(QPainter::TextAntialiasing);
    rect = QRect(0,0,this->width(),this->height());
    wbpainter.setViewport(rect);
    wbpainter.setWindow(0,0,500,500);
    this->wbdrawArc(&wbpainter);
    double j=225;
    for (int i=0;i<=12;i++)
    {
        QString istr = QString::number(i,10);

        this->wbcircleEquation(190,j);
        this->wbdrawNumber(&wbpainter,istr,x,y);
        for(int line_i = 0;line_i<=4;line_i++)
        {
            int x1,x2,y1,y2,r;
            int linewidth;
            if (line_i == 0)
            {
                linewidth = 5;
                r=110;
            }
            else
            {
                linewidth = 2;
                r=130;
            }
            this->wbcircleEquation(150,j-line_i*4.5);
            x1=x;
            y1=y;
            this->wbcircleEquation(r,j-line_i*4.5);
            x2=x;
            y2=y;
            this->wbdrawLine(&wbpainter,linewidth,x1,y1,x2,y2);
            if (j == -45 && line_i == 0)
                break;
        }
        j = j-22.5;
    }


    j=225;
    int x1,x2,x3,y1,y2,y3;
    this->wbcircleEquation(140,j-pointer_number*4.5);
    x1=x;
    y1=y;
    this->wbcircleEquation(25,j-pointer_number*4.5-22.5);
    x2=x;
    y2=y;
    this->wbcircleEquation(25,j-pointer_number*4.5+22.5);
    x3=x;
    y3=y;
    this->wbdrawPointer(&wbpainter,x1,y1,x2,y2,x3,y3);
    this->wbdrawEllips(&wbpainter);
}


//接口函数
void WBgaugeone::setpointer_number(int pointer)//设置指针指向0-60
{
    if(pointer>=0&&pointer<=60)
    {
    pointer_number = pointer;
    this->repaint();
    }
}
void WBgaugeone::setcolorarc(QColor rarc)  //最外层圆弧颜色
{
    colorarc = rarc;
    this->repaint();
}
void WBgaugeone::setcolorarc2(QColor rarc2) //中心圆渐变色起点颜色
{
    colorarc2 = rarc2;
    this->repaint();
}
void WBgaugeone::setcolornumber(QColor number) //数字颜色
{
    colornumber = number;
    this->repaint();
}
void WBgaugeone::setcolorline(QColor line) //度量标直线颜色
{
    colorline = line;
    this->repaint();
}
void WBgaugeone::setcolorlips(QColor lips)//圆的终点颜色
{
    colorelips = lips;
    this->repaint();
}
void WBgaugeone::setcolorpointer(QColor pointer)//指针颜色
{
    colorpointer = pointer;
    this->repaint();
}

总结

仪表盘
制作人:博咯
仅限他人学习,交流使用
void setpointer_number(int pointer);//设置指针指向0-60
void setcolorarc(QColor rarc); //最外层圆弧颜色
void setcolorarc2(QColor rarc2); //中心圆渐变色起点颜色
void setcolornumber(QColor number); //数字颜色
void setcolorline(QColor line); //度量标直线颜色
void setcolorlips(QColor lips);//圆的终点颜色
void setcolorpointer(QColor pointer);//指针颜色

该仪表盘主要通过QPainter进行绘制,可能有沉余代码,可以更加简洁,谢谢大家点赞及指导!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值