Qt绘制仪表盘

在Qt的开发过程中,有些复杂的界面展示需要自动绘制,比如仪表盘的数据变化,都是动态的,而显示的效果只能通过paintEvent事件来自绘,本篇介绍仪表盘的绘制。

绘制分为4个部分

1.绘制背景

void DrawDashboard::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

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

    //绘制背景
    painter.setPen(Qt::NoPen);
    painter.fillRect(this->rect(), Qt::gray);
    painter.drawPixmap(0, 0, m_pixmap);
}

2.绘制圆弧

void DrawDashboard::drawArc(QPainter &painter)
{
    m_temperature = (m_temperature > 54) ? 54 : m_temperature;
    m_temperature = (m_temperature < -18) ? -18 : m_temperature;

    QColor color;
    if(m_temperature <= 0 || m_temperature >= 35)
        color = QColor("#FF0000");
    else if(m_temperature > 3 && m_temperature < 32)
        color = QColor("#28C840");
    else
        color = QColor("#FBC320");

    QPen pen(color, 8, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    painter.setPen(pen);
    QRect rectangle(11, 11, 278, 278);//px, px, w, h
    //度数对应数学的象限度数
    int startAngle = 0 * 16;
    int spanAngle = 270 * 16;
    //绘制圆弧:  绘制由给定矩形 startAngle 和 spanAngle 定义的圆弧。startAngle 和 spanAngle 必须以 1/16 度为单位指定,
    //          即一个完整的圆等于5760(16 * 360)。角度的正值表示逆时针方向,负值表示顺时针方向。零度位于 3 点钟位置。
    //矩形区域 起始角度 偏转角度
    //painter.drawArc(rectangle, startAngle, spanAngle);

    int startPos = 180 * 16;  //9点钟位置
    if(m_temperature > 0)
    {
        //正数
        //float endPos = -5.4 * 16 * m_temperature; //顺时针旋转270度  270.0 / 50 = 5.4
        float endPos = -5 * 16 * m_temperature; //顺时针旋转270度  270.0 / 54 = 5
        painter.drawArc(rectangle, startPos, static_cast<int>(endPos));
    }
    else
    {
        //负数
        //float endPos = -9 * 16 * m_temperature; //顺时针旋转90度   90 / 10 = 9
        float endPos = -5 * 16 * m_temperature; //顺时针旋转90度   90 / 18 = 5
        painter.drawArc(rectangle, startPos, static_cast<int>(endPos));
    }

}

3、绘制刻度

void DrawDashboard::drawScale(QPainter &painter, int radius)
{
    int w = width();
    int h = height();
    //int radius = qMin(w, h) / 2;
    QPoint center(w / 2, h / 2);
    //painter.setPen(QPen(Qt::black, radius * 0.05));
    painter.setPen(QPen(QColor("#DDDDDD"), 1));
    painter.setBrush(QBrush(QColor("#FFFFFF")));
    QRectF rectangle(0, 0, 24, 4);

    std::vector<int> vecVal{0, 3, 35};//0刻度   3刻度    35刻度
    for (size_t i = 0; i < vecVal.size(); ++i) {
        float flo = vecVal[i];
        int val = vecVal[i];
        if(val == 0 && m_temperature < 0)
            flo = 6.5;
        else
            flo = val + 6;

        QPointF point(0, 0);
        painter.save();
        point.setX(radius * qCos(((210 - flo * 5.0)*M_PI)/180));
        point.setY(radius * qSin(((210 - flo * 5.0)*M_PI)/180));
        painter.translate(point.x(), -point.y());
        painter.rotate(-30 + flo * 5.0);
        painter.drawRoundedRect(rectangle, 2, 2);
        painter.restore();
    }

}

4、绘制刻度值

void DrawDashboard::drawScaleValue(QPainter &painter, int radius)
{
    //设置画笔,画笔默认NoPen
    painter.setPen(QColor(153, 153, 153)); //#999999
    QFont font;
    font.setFamily("Microsoft YaHei");
    font.setPixelSize(12);
    painter.setFont(font);

    std::vector<int> vecVal{0, 3, 35};//0刻度   3刻度    35刻度
    for (size_t i = 0; i < vecVal.size(); ++i) {
        float flo = vecVal[i];
        int val = vecVal[i];
        if(val == 0 && m_temperature < 0)
            flo = 6.5;
        else
            flo = val + 6;

        QPointF point(0, 0);
        painter.save();
        point.setX(radius * qCos(((210 - flo * 5.0)*M_PI)/180));
        point.setY(radius * qSin(((210 - flo * 5.0)*M_PI)/180));
        painter.translate(point.x(), -point.y());
        painter.rotate(-120 + flo * 5.0);
        painter.drawText(-15, -5, 30, 30, Qt::AlignCenter, QString::number(vecVal[i]));
        painter.restore();
    }

    //还原画笔
    painter.setPen(Qt::NoPen);
}

5、绘制文字

void DrawDashboard::drawTemperature(QPainter &painter, int width)
{
    painter.save();
    m_temperature = (m_temperature > 54) ? 54 : m_temperature;
    m_temperature = (m_temperature < -18) ? -18 : m_temperature;

    QColor color;
    if(m_temperature <= 0 || m_temperature >= 35)
        color = QColor("#FF0000");
    else if(m_temperature > 3 && m_temperature < 32)
        color = QColor("#28C840");
    else
        color = QColor("#FBC320");

    painter.setPen(color);
    QFont font;
    font.setFamily("Microsoft YaHei");
    font.setPixelSize(14);
    painter.setFont(font);
    QString strText = QString("正常水温");
    painter.drawText(20, 70, width - 40, 16, Qt::AlignCenter, strText);
    font.setPixelSize(12);
    painter.setFont(font);
    painter.drawText(220, 102, 14, 14, Qt::AlignCenter, QString("°C"));

    font.setPixelSize(96);
    painter.setFont(font);
    int i = m_temperature * 10;
    m_temperature = (float)i / 10; //保留一位小数
    QString strTemp = QString::number(m_temperature) + QString("°C");
    painter.drawText(50, 120, 200, 80, Qt::AlignCenter, QString::number(m_temperature));
    painter.restore();
}

效果:

完整代码:

#ifndef DRAWDASHBOARD_H
#define DRAWDASHBOARD_H

#include <QWidget>
#include <QPainter>

class DrawDashboard: public QWidget
{
    Q_OBJECT
public:
    DrawDashboard(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent *event) override;

private:
    void drawArc(QPainter &painter);
    void drawScale(QPainter &painter, int radius);  //画刻度
    void drawScaleValue(QPainter &painter, int radius);  //画刻度值
    void drawTemperature(QPainter &painter, int width); //画温度

    void drawPoint(QPainter &painter, int radius);
    void drawDigital(QPainter &painter, int radius);
    void drawCircle(QPainter &painter, int radius);
    void drawSmallScale(QPainter &painter, int radius);
    void drawBigScale(QPainter &painter, int radius);
    void drawText(QPainter &painter, int radius);
    void drawPointer(QPainter &painter, int radius);
    void drawIndicator(QPainter &painter, int radius);



public slots:
    void slotValueChanged(int value);
    void slotTemperatureValueChanged(int value);

private:
    int degRotate{-120};
    float m_temperature{3.0f};
    QPixmap m_pixmap;
};

#endif // DRAWDASHBOARD_H
#include "drawdashboard.h"

#include <QPen>
#include <QBrush>
#include <QRect>
#include <QPainterPath>
#include <QRadialGradient>
#include <QtMath>
#include <QDebug>
#include <vector>

#define PI 3.14159


DrawDashboard::DrawDashboard(QWidget *parent)
    :QWidget(parent)
{
    m_pixmap = QPixmap(":/image/dashboard.png");
}

void DrawDashboard::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

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

    //绘制背景
    painter.setPen(Qt::NoPen);
    painter.fillRect(this->rect(), Qt::gray);
    painter.drawPixmap(0, 0, m_pixmap);

    drawArc(painter);

    int width = this->width();
    int height = this->height();
    int radius = ((width > height) ? height : width) / 2;
    painter.translate(width/2, height/2);
    drawScale(painter, radius);
    drawScaleValue(painter, radius - 25);

    //恢复正常坐标
    painter.translate(-width/2, -height/2);
    drawTemperature(painter, width);


    //移动画笔到中下方
    //painter.translate(width/2, height*0.6);
    //设置画刷颜色
    //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 DrawDashboard::drawArc(QPainter &painter)
{
    m_temperature = (m_temperature > 54) ? 54 : m_temperature;
    m_temperature = (m_temperature < -18) ? -18 : m_temperature;

    QColor color;
    if(m_temperature <= 0 || m_temperature >= 35)
        color = QColor("#FF0000");
    else if(m_temperature > 3 && m_temperature < 32)
        color = QColor("#28C840");
    else
        color = QColor("#FBC320");

    QPen pen(color, 8, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    painter.setPen(pen);
    QRect rectangle(11, 11, 278, 278);//px, px, w, h
    //度数对应数学的象限度数
    int startAngle = 0 * 16;
    int spanAngle = 270 * 16;
    //绘制圆弧:  绘制由给定矩形 startAngle 和 spanAngle 定义的圆弧。startAngle 和 spanAngle 必须以 1/16 度为单位指定,
    //          即一个完整的圆等于5760(16 * 360)。角度的正值表示逆时针方向,负值表示顺时针方向。零度位于 3 点钟位置。
    //矩形区域 起始角度 偏转角度
    //painter.drawArc(rectangle, startAngle, spanAngle);

    int startPos = 180 * 16;  //9点钟位置
    if(m_temperature > 0)
    {
        //正数
        //float endPos = -5.4 * 16 * m_temperature; //顺时针旋转270度  270.0 / 50 = 5.4
        float endPos = -5 * 16 * m_temperature; //顺时针旋转270度  270.0 / 54 = 5
        painter.drawArc(rectangle, startPos, static_cast<int>(endPos));
    }
    else
    {
        //负数
        //float endPos = -9 * 16 * m_temperature; //顺时针旋转90度   90 / 10 = 9
        float endPos = -5 * 16 * m_temperature; //顺时针旋转90度   90 / 18 = 5
        painter.drawArc(rectangle, startPos, static_cast<int>(endPos));
    }

}

void DrawDashboard::drawScale(QPainter &painter, int radius)
{
    int w = width();
    int h = height();
    //int radius = qMin(w, h) / 2;
    QPoint center(w / 2, h / 2);
    //painter.setPen(QPen(Qt::black, radius * 0.05));
    painter.setPen(QPen(QColor("#DDDDDD"), 1));
    painter.setBrush(QBrush(QColor("#FFFFFF")));
    QRectF rectangle(0, 0, 24, 4);

    std::vector<int> vecVal{0, 3, 35};//0刻度   3刻度    35刻度
    for (size_t i = 0; i < vecVal.size(); ++i) {
        float flo = vecVal[i];
        int val = vecVal[i];
        if(val == 0 && m_temperature < 0)
            flo = 6.5;
        else
            flo = val + 6;

        QPointF point(0, 0);
        painter.save();
        point.setX(radius * qCos(((210 - flo * 5.0)*M_PI)/180));
        point.setY(radius * qSin(((210 - flo * 5.0)*M_PI)/180));
        painter.translate(point.x(), -point.y());
        painter.rotate(-30 + flo * 5.0);
        painter.drawRoundedRect(rectangle, 2, 2);
        painter.restore();
    }


//    //painter.setBrush(QBrush(QColor("#ff0000")));
//    //for (int i = 6; i <= 54; ++i)
//    float i = 6;
//    while (i <= 56) {
//        QPointF point(0, 0);
//        painter.save();
//        float f = i;
//        if(i == 6)
//            f = 5.5;
//        //计算并移动绘图对象中心点
//        point.setX(radius*qCos(((210 - f * 5.4) * M_PI) / 180));
//        point.setY(radius*qSin(((210 - f * 5.4) * M_PI) / 180));
//        //计算并移动绘图对象的中心点
//        painter.translate(point.x(), -point.y());
//        //计算并选择绘图对象坐标
//        painter.rotate(-30 + f * 5.4);
//        painter.drawRoundedRect(rectangle, 2, 2);
//        painter.restore();
//        i += 1;
//    }



//    painter.setBrush(QBrush(QColor("#563582")));
//    for (int i = 0; i <= 11; ++i) {
//        //int angle = i * 30;
//        //QPainter::drawLine(int x1, int y1, int x2, int y2)
//        //QPainter::drawLine(const QPoint &p1, const QPoint &p2)
        QPoint p1 = center + QPoint(radius * cos(angle * M_PI / 180.0), radius * sin(angle * M_PI / 180.0));
        QPoint p2 = center + QPoint((radius - radius * 0.15) * cos(angle * M_PI / 180.0), (radius - radius * 0.15) * sin(angle * M_PI / 180.0));
        qDebug() << "DrawDashboard::drawScale==i==" << i << " p1=" << p1 << " p2=" << p2;
//        //painter.drawLine(p1, p2);
//        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.rotate(-30 + i * 20);
//        painter.drawRoundedRect(rectangle, 2, 2);
//        painter.restore();
//    }

}

void DrawDashboard::drawScaleValue(QPainter &painter, int radius)
{
    //设置画笔,画笔默认NoPen
    painter.setPen(QColor(153, 153, 153)); //#999999
    QFont font;
    font.setFamily("Microsoft YaHei");
    font.setPixelSize(12);
    painter.setFont(font);

    std::vector<int> vecVal{0, 3, 35};//0刻度   3刻度    35刻度
    for (size_t i = 0; i < vecVal.size(); ++i) {
        float flo = vecVal[i];
        int val = vecVal[i];
        if(val == 0 && m_temperature < 0)
            flo = 6.5;
        else
            flo = val + 6;

        QPointF point(0, 0);
        painter.save();
        point.setX(radius * qCos(((210 - flo * 5.0)*M_PI)/180));
        point.setY(radius * qSin(((210 - flo * 5.0)*M_PI)/180));
        painter.translate(point.x(), -point.y());
        painter.rotate(-120 + flo * 5.0);
        painter.drawText(-15, -5, 30, 30, Qt::AlignCenter, QString::number(vecVal[i]));
        painter.restore();
    }

//    painter.setBrush(QBrush(QColor("#ff0000")));
//    for (int i = 6; i <= 54; ++i)
//    {
//        QPointF point(0, 0);
//        painter.save();
//        float f = i;
//        if(i == 6)
//            f = 5.5;
//        //计算并移动绘图对象中心点
//        point.setX(radius*qCos(((210 - f * 5.4) * M_PI) / 180));
//        point.setY(radius*qSin(((210 - f * 5.4) * M_PI) / 180));
//        //计算并移动绘图对象的中心点
//        painter.translate(point.x(), -point.y());
//        //计算并选择绘图对象坐标
//        painter.rotate(-120 + f * 5.4);
//        painter.drawText(-15, -5, 30, 30, Qt::AlignCenter, QString::number(i-6));
//        painter.restore();
//    }

//    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.drawText(-15, -5, 30, 30, Qt::AlignCenter, QString::number(i*2));
//        painter.restore();
//    }
    //还原画笔
    painter.setPen(Qt::NoPen);
}

void DrawDashboard::drawTemperature(QPainter &painter, int width)
{
    painter.save();
    m_temperature = (m_temperature > 54) ? 54 : m_temperature;
    m_temperature = (m_temperature < -18) ? -18 : m_temperature;

    QColor color;
    if(m_temperature <= 0 || m_temperature >= 35)
        color = QColor("#FF0000");
    else if(m_temperature > 3 && m_temperature < 32)
        color = QColor("#28C840");
    else
        color = QColor("#FBC320");

    //QPen pen(color, 8, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
    //painter.setPen(pen);

    painter.setPen(color);
    QFont font;
    font.setFamily("Microsoft YaHei");
    font.setPixelSize(14);
    painter.setFont(font);
    QString strText = QString("正常水温");
    painter.drawText(20, 70, width - 40, 16, Qt::AlignCenter, strText);
    font.setPixelSize(12);
    painter.setFont(font);
    painter.drawText(220, 102, 14, 14, Qt::AlignCenter, QString("°C"));

    font.setPixelSize(96);
    painter.setFont(font);
    int i = m_temperature * 10;
    m_temperature = (float)i / 10; //保留一位小数
    QString strTemp = QString::number(m_temperature) + QString("°C");
    painter.drawText(50, 120, 200, 80, Qt::AlignCenter, QString::number(m_temperature));
    painter.restore();
}

//绘制外圈点
void DrawDashboard::drawPoint(QPainter &painter, int radius)
{
    //组装点的路径图
    QPainterPath pointPath;
    int scale = 2;
    pointPath.moveTo(-2 * scale, -2 * scale);
    pointPath.lineTo(2 * scale, -2 * scale);
    pointPath.lineTo(2 * scale, 2 * scale);
    pointPath.lineTo(0, 4 * scale);
    pointPath.lineTo(-2 * scale, 2 * scale);
    //绘制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 DrawDashboard::drawDigital(QPainter &painter, int radius)
{
    //设置画笔,画笔默认NoPen
    painter.setPen(QColor(218, 112, 214));
    QFont font;
    font.setFamily("Cambria");
    font.setPixelSize(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 DrawDashboard::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.restore();
}
//绘制刻度
void DrawDashboard::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 DrawDashboard::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 DrawDashboard::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, 80, 30, Qt::AlignCenter, QString("km/h°C"));
    painter.restore();
}

//绘制指针
void DrawDashboard::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 DrawDashboard::drawIndicator(QPainter &painter, int radius)
{

}

void DrawDashboard::slotValueChanged(int value)
{
    this->degRotate = value;
    update();
}

void DrawDashboard::slotTemperatureValueChanged(int value)
{
    int iVal = value * 10;
    m_temperature =  (float)iVal / 10; //保留一位小数
    update();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void initData();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "drawdashboard.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initData();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initData()
{
    ui->hSliderTemperature->setRange(-18, 54);
    ui->hSliderTemperature->setSingleStep(1);
    ui->hSliderTemperature->setPageStep(1);
    ui->widget->setGeometry(10, 10, 300, 300);

    connect(ui->hSliderTemperature, SIGNAL(valueChanged(int)), ui->widget, SLOT(slotTemperatureValueChanged(int)));
}

效果:

参考:

https://www.jb51.net/article/236740.htm                
https://www.jb51.net/article/176862.htm                
https://blog.csdn.net/hw5230/article/details/132365548

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值