Qt重绘控件之时速表

Qt重绘简易时速表
效果:

在这里插入图片描述

使用时,将该类作为QWidget的提升或直接拿来new即可!
classProgress : publicQWidget
{
    Q_OBJECT
 
public:
    Progress(QWidget *parent = 0);
    ~Progress();
 
protected:
    unsignedinttimerId;
    voidtimerEvent(QTimerEvent *event);
 
    voidpaintEvent(QPaintEvent *event);
 
    voidinitPainter();
    voiddrawY3(QPainter *);
    voiddrawOut(QPainter *);
 
publicslots:
    voidsetValue(int);
 
private:
    QPointFcenterPol;
    floatradius;
 
    unsignedintvalue,currentValue;
};
 Progress::Progress(QWidget *parent) : QWidget(parent)
{
    timerId = 0;
    value = currentValue = 0;
}
 
Progress::~Progress()
{
 
}
 
voidProgress::timerEvent(QTimerEvent *event)
{
    if (event->timerId() == timerId)
    {
       if (currentValue < value)
       {
           currentValue += 1;
       }
       elseif (currentValue > value)
       {
           currentValue -= 1;
       }
       else
       {
           killTimer(timerId);
       }
    }
    update();
}
 
voidProgress::paintEvent(QPaintEvent *event)
{
    initPainter();
 
    QPainterpainter;
    painter.begin(this);
 
    drawY3(&painter);
    drawOut(&painter);
 
    painter.end();
}
 
voidProgress::initPainter()
{
    centerPol = QPointF(this->height() /2.0, this->width() /2.0);
 
    radius = this->height() /2.0;
}
 
voidProgress::drawY3(QPainter *painter)
{
    painter->save();
 
    painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
    //////////////////////////////////////////////////
    painter->setPen(Qt::NoPen);
    painter->setBrush(QColor(234,234, 234));
    painter->drawEllipse(centerPol, radius * 0.7, radius * 0.7);
 
    painter->setBrush(QColor(45,200, 119));
    painter->drawEllipse(centerPol, radius * 0.48,radius *0.48);
 
    painter->setBrush(QColor(238,240, 240));
    painter->drawEllipse(centerPol, radius * 0.26,radius *0.26);
 
    painter->setPen(QPen(QColor(65,170,224)));
    QFontfont("CourierNew", radius*0.095);
    font.setBold(true);
    painter->setFont(font);
    painter->drawText(centerPol.x()*0.93,centerPol.y()*1.04,QString::number(currentValue));
    //////////////////////////////////////////////////
 
    painter->restore();
}
 
voidProgress::drawOut(QPainter *painter)
{
    painter->save();
 
    painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
    //////////////////////////////////////////////////
    painter->translate(centerPol);
    painter->rotate(45);
 
    //////////////////////////
    painter->save();
    painter->setPen(QColor(180,180, 180));
    QFontfont("CourierNew", radius*0.08);
    painter->setFont(font);
    painter->rotate(-45);
    painter->drawText(-(radius*0.53), radius*0.7, QString::number(0));
    painter->drawText(radius*0.36, radius*0.7, QString::number(100));
    painter->restore();
    //////////////////////////
 
    QPenpen;
    pen.setWidth(3);
    for (unsignedinti = 0; i <100; ++i)
    {
       if (i < currentValue)
       {
           pen.setColor(QColor(154,216, 39));
       }
       else
       {
           pen.setColor(QColor(200,200, 200));
       }
       painter->setPen(pen);
 
       painter->drawLine(0, radius*0.80,0, radius*0.95);
       painter->rotate(2.7);
    }
    //////////////////////////////////////////////////
 
    painter->restore();
}
 
voidProgress::setValue(inti)
{
    value = i;
    timerId = startTimer(30);
}
  • 源码链接稍后上传、或查看下面公众号获取。
关注

微信公众号搜索"Qt_io_"或"Qt开发者中心"了解更多关于Qt、C++开发知识.。

笔者 - jxd

发布了43 篇原创文章 · 获赞 0 · 访问量 3022

猜你喜欢

转载自blog.csdn.net/automoblie0/article/details/100015496
今日推荐