187 lines
5.2 KiB
C++
187 lines
5.2 KiB
C++
#include "customprogressindicator.h"
|
|
#include <QPainter>
|
|
#include <QPainterPath>
|
|
|
|
CustomProgressIndicator::CustomProgressIndicator(QWidget* parent)
|
|
: QWidget(parent),
|
|
angle_(0),
|
|
timerId_(-1),
|
|
delay_(20),
|
|
displayedWhenStopped_(false),
|
|
color_(Qt::green) {
|
|
setAttribute(Qt::WA_DeleteOnClose);
|
|
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
|
setFocusPolicy(Qt::NoFocus);
|
|
setWindowFlags(Qt::FramelessWindowHint);//无窗体
|
|
setAttribute(Qt::WA_TranslucentBackground);//背景透明
|
|
}
|
|
|
|
bool CustomProgressIndicator::isAnimated () const {
|
|
return (timerId_ != -1);
|
|
}
|
|
|
|
void CustomProgressIndicator::setDisplayedWhenStopped(bool state) {
|
|
displayedWhenStopped_ = state;
|
|
|
|
update();
|
|
}
|
|
|
|
bool CustomProgressIndicator::isDisplayedWhenStopped() const {
|
|
return displayedWhenStopped_;
|
|
}
|
|
void CustomProgressIndicator::setDisplayModel(int iFlag)
|
|
{
|
|
m_iLoopBackFlag=iFlag;
|
|
}
|
|
void CustomProgressIndicator::startAnimation() {
|
|
angle_ = 0;
|
|
|
|
if (timerId_ == -1) {
|
|
timerId_ = startTimer(delay_);
|
|
}
|
|
}
|
|
void CustomProgressIndicator::setDisplayStringInfo(QString strTip,QString strTiping) {
|
|
m_strTip=strTip;
|
|
m_strTiping=strTiping;
|
|
update();
|
|
}
|
|
void CustomProgressIndicator::stopAnimation() {
|
|
if (timerId_ != -1) {
|
|
killTimer(timerId_);
|
|
}
|
|
|
|
timerId_ = -1;
|
|
|
|
update();
|
|
}
|
|
|
|
void CustomProgressIndicator::setAnimationDelay(int delay) {
|
|
if (timerId_ != -1){
|
|
killTimer(timerId_);
|
|
}
|
|
|
|
delay_ = delay;
|
|
|
|
if (timerId_ != -1){
|
|
timerId_ = startTimer(delay_);
|
|
}
|
|
}
|
|
|
|
void CustomProgressIndicator::setColor(const QColor & color) {
|
|
color_ = color;
|
|
|
|
update();
|
|
}
|
|
|
|
QSize CustomProgressIndicator::sizeHint() const {
|
|
return QSize(80,80);
|
|
}
|
|
|
|
|
|
void CustomProgressIndicator::timerEvent(QTimerEvent * /*event*/) {
|
|
angle_ = (angle_+30)%360;
|
|
|
|
update();
|
|
}
|
|
|
|
void CustomProgressIndicator::paintEvent(QPaintEvent * /*event*/) {
|
|
QPainter p(this);
|
|
|
|
// if(m_iFlagFinishedSuccess==1)
|
|
// {
|
|
// drawUnderCircle(&p);
|
|
// }
|
|
// else
|
|
{
|
|
drawJuHua(&p);
|
|
}
|
|
|
|
|
|
}
|
|
void CustomProgressIndicator::drawJuHua(QPainter *painter)
|
|
{
|
|
painter->setRenderHint(QPainter::Antialiasing);
|
|
if (displayedWhenStopped_ && !isAnimated()) //如果displayedWhenStopped_==flash并且动画已经停止则不绘制
|
|
{
|
|
painter->setPen(color_);
|
|
painter->drawPixmap(rect(),currentPix_);
|
|
painter->drawText(rect(), Qt::AlignCenter, m_strTip);
|
|
|
|
return;
|
|
}
|
|
|
|
int width = qMin(this->width(), this->height());
|
|
|
|
|
|
int outerRadius = (width-1) >> 1;
|
|
int innerRadius = int(((width-1) >> 1)*0.38);
|
|
|
|
int capsuleHeight = outerRadius - innerRadius;
|
|
int capsuleWidth = (width > 32 ) ? (int)(capsuleHeight *0.23) : (int)(capsuleHeight *0.35);
|
|
int capsuleRadius = capsuleWidth >> 1;
|
|
if(m_iLoopBackFlag==1)
|
|
{
|
|
painter->setPen(color_);
|
|
painter->drawText(rect(), Qt::AlignCenter, m_strTiping);
|
|
|
|
}
|
|
else {
|
|
/* 撰写进度 */
|
|
if (progress_ > 0 && progress_ < 100) {
|
|
painter->setPen(color_);
|
|
painter->drawText(rect(), Qt::AlignCenter, QString("%1%").arg(progress_));
|
|
}
|
|
else if (progress_ == 100) {
|
|
stopAnimation();
|
|
}
|
|
}
|
|
|
|
for (int i=0; i<12; ++i) {
|
|
QColor color = color_;
|
|
color.setAlphaF(1.0f - (i/12.0f));
|
|
painter->setPen(Qt::NoPen);
|
|
painter->setBrush(color);
|
|
painter->save();
|
|
painter->translate(rect().center());
|
|
painter->rotate(angle_ - i*30.0f);
|
|
painter->drawRoundedRect(((-capsuleWidth) >> 1), -(innerRadius+capsuleHeight), capsuleWidth, capsuleHeight, capsuleRadius, capsuleRadius);
|
|
painter->restore();
|
|
}
|
|
|
|
}
|
|
//没有使用的画圆环函数
|
|
void CustomProgressIndicator::drawUnderCircle(QPainter *painter)
|
|
{
|
|
int bigradius = 50;
|
|
painter->save();
|
|
painter->setPen(color_);
|
|
painter->setBrush(color_);
|
|
|
|
QPainterPath bigCircle;
|
|
bigCircle.addEllipse(-width()/2, -height()/2, bigradius*2, bigradius*2);
|
|
|
|
int smallradius = 40;
|
|
QPainterPath smallCircle;
|
|
smallCircle.addEllipse(-width()/2, -height()/2, smallradius*2, smallradius*2);
|
|
|
|
QPainterPath path = bigCircle - smallCircle;
|
|
painter->drawPath(path);
|
|
painter->setPen(color_);
|
|
painter->drawText(rect(), Qt::AlignCenter, m_strTip);
|
|
painter->restore();
|
|
|
|
/* painter->save();
|
|
painter->setPen(color_);
|
|
painter->setBrush(color_);
|
|
int m_outerRadius=width()>height()?(qreal)height()/2-4:(qreal)width()/2-4;//求最小的那个值。自己可以测试一下减4个像素与不减的区别
|
|
QPointF TopLeft(rect().center().x() - m_outerRadius,rect().center().y() - m_outerRadius);
|
|
QPointF BottomRight(rect().center().x() + m_outerRadius,rect().center().y() + m_outerRadius);
|
|
QRectF CircleRect(TopLeft,BottomRight);//大圆矩形
|
|
|
|
//painter->setPen(Qt::NoPen);//大家可以注释掉这行看一下,有什么差别?
|
|
painter->drawEllipse(CircleRect);//画椭圆,其实就是画圆。特殊椭圆而已
|
|
painter->setPen(Qt::white);
|
|
painter->drawText(rect(), Qt::AlignCenter, m_strTip);
|
|
painter->restore();*/
|
|
}
|