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