ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

QT自定义控件之进度条

2019-08-24 18:35:34  阅读:404  来源: 互联网

标签:控件 return QT 自定义 minVal double void QProg painter


#ifndef QPROG_H
#define QPROG_H

#include <QWidget>
#include <QPainter>
#include <math.h>
#include <QString>
#include <QMouseEvent>

class QProg : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(double value READ value WRITE setValue);
    Q_PROPERTY(double min READ minValue WRITE setMinValue);
    Q_PROPERTY(double max READ maxValue WRITE setMaxValue);
    Q_PROPERTY(int font READ font WRITE setFontDim);
    Q_PROPERTY(int numPrec READ numPrec WRITE setPrecision);
    Q_PROPERTY(QColor color READ color WRITE setBarColor);

    double value() const
    {
        return actVal;
    }
    double minValue() const
    {
        return minVal;
    }
    double maxValue() const
    {
        return maxVal;
    }
    int font() const
    {
        return fontDim;
    }
    int numPrec() const
    {
        return precision;
    }
    QColor color() const
    {
        return colBar;
    }
public:
    QProg(QWidget* parent = 0);
    QSize minimumSizeHint() const;
    QSize sizeHint() const;
    ~QProg();

signals:
    void valueChanged(double);

public slots:
    void setValue(double);
    void setMaxValue(double);
    void setMinValue(double);
    void setFontDim(int);
    void setPrecision(int);
    void setBarColor(QColor);

protected:
    void paintEvent(QPaintEvent *);
    void initValue();
    void paintBorder();
    void paintBar();
    void paintLine();
    void paintValue();

private:
    int fontDim;
    int precision;
    double lengthBar;
    double minVal;
    double maxVal;
    double actVal;
    QColor colBar;
};

#endif // QPROG_H
#include "qprog.h"

QProg::QProg(QWidget *parent)
    : QWidget(parent)
{
    initValue();
}

void QProg::paintEvent(QPaintEvent *)
{
    paintBorder();
    paintBar();
    paintLine();
    paintValue();
}

void QProg::initValue()
{
    minVal = 0;
    maxVal = 100;
    actVal = 0;
    fontDim = 20;
    precision = 0;
    lengthBar = 0;
    colBar = Qt::green;
}

void QProg::paintBorder()
{
    QPainter painter(this);
    painter.setWindow(0, 0, 470, 80);
    painter.setRenderHint(QPainter::Antialiasing);

    QLinearGradient linGrad(5, 40, 15, 40);
    linGrad.setColorAt(0, Qt::white);
    linGrad.setColorAt(1, Qt::black);
    linGrad.setSpread(QGradient::PadSpread);
    painter.setBrush(linGrad);
    QRectF border(5, 5, 460, 70);
    painter.drawRoundRect(border, 3);

    // value rect
    painter.setBrush(QColor(70, 70, 70));
    QRectF value(385, 10, 75, 60);
    painter.drawRoundRect(value, 15);
}

void QProg::paintBar()
{
    QPainter painter(this);
    painter.setWindow(0, 0, 470, 80);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(QColor(70, 70, 70));
    //background color
    QRectF back(20, 10, 360, 60);
    painter.drawRoundRect(back, 3);
    // chech value
    if (actVal > maxVal)
        return;
    if (actVal < minVal)
        return;
    // waiting state if min = max
    if(minVal == maxVal)
    {
        painter.setBrush(colBar);
        QRectF bar(40, 10, 40, 60);
        QRectF bar1(130, 10, 40, 60);
        QRectF bar2(220, 10, 40, 60);
        QRectF bar3(310, 10, 40, 60);
        painter.drawRoundRect(bar, 3);
        painter.drawRoundRect(bar1, 3);
        painter.drawRoundRect(bar2, 3);
        painter.drawRoundRect(bar3, 3);
        return;
    }
    // check positive or negative scale
    if (maxVal >= 0 && minVal >= 0 || maxVal >= 0 && minVal <= 0)
        lengthBar = 360-360 * (maxVal-actVal)/(maxVal-minVal);
    if (maxVal <= 0 && minVal <= 0)
        lengthBar = 360 * (minVal-actVal)/(minVal-maxVal);
    // length and color bar
    painter.setBrush(colBar);
    QRectF bar(20, 10, lengthBar, 60);
    painter.drawRoundRect(bar, 3);
    emit valueChanged(actVal);
}

void QProg::paintLine()
{
    QPainter painter(this);
    painter.setWindow(0, 0, 470, 80);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(QPen(Qt::black, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));

    for (int i = 0; i <= 40; i++)
    {
        painter.drawLine(20+(360/40*i), 10, 20+(360/40*i), 70);
    }
}

void QProg::paintValue()
{
    QPainter painter(this);
    painter.setWindow(0, 0, 470, 80);
    painter.setRenderHint(QPainter::Antialiasing);
    QRectF value(385, 10, 75, 60);
    QFont font("Arial", fontDim, QFont::Normal);
    painter.setFont(font);
    painter.setPen(QPen(Qt::white));
    double x = 100;
    double y = 360;
    QString val = QString("%1").arg(lengthBar*(x/y), 0, 'f', precision);
    val.append("%");
    painter.drawText(value, Qt::AlignCenter, val);
}

void QProg::setValue(double value)
{
    if (value > maxVal)
    {
        actVal = maxVal;
        update();
        return;
    }
    if (value < minVal)
    {
        actVal = minVal;
        update();
        return;
    }
    actVal = value;
    update();
}

void QProg::setMinValue(double min)
{
    if (min > maxVal)
    {
        minVal = maxVal;
        maxVal = min;
        actVal = minVal;
        update();
        return;
    }
    minVal = min;
    update();
}

void QProg::setMaxValue(double max)
{
    if (max < minVal)
    {
        maxVal = minVal;
        minVal = max;
        actVal = minVal;
        update();
        return;
    }
    maxVal = max;
    update();
}

void QProg::setFontDim(int font)
{
    fontDim = font;
    update();
}

void QProg::setPrecision(int numPrec)
{
    precision = numPrec;
    update();
}

void QProg::setBarColor(QColor color)
{
    colBar = color;
    update();
}


QSize QProg::minimumSizeHint() const
{
    return QSize(47, 8);
}

QSize QProg::sizeHint() const
{
    return QSize(470, 80);
}

QProg::~QProg()
{

}

 

标签:控件,return,QT,自定义,minVal,double,void,QProg,painter
来源: https://blog.csdn.net/zym326975/article/details/100055865

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有