Qt重绘控件之等待

Qt重绘控件之等待条(来自京东刷新gif)

闲来无事制作重绘控件工作

效果如图: (因为录制帧原因,效果不佳)

在这里插入图片描述

源码
class Wait : public QWidget
{
	Q_OBJECT

public:
	Wait(QWidget *parent = 0);
	~Wait();

	//外接口,填充色
	void fillColor(QColor color = QColor(250,167,208));

protected:
	void timerEvent(QTimerEvent *);
	void paintEvent(QPaintEvent *);

	void drawAssist(QPainter *);
	void drawFillColor(QPainter *);	

private:
	void initParameter();
	QPointF center;
	float outRadius,inRadius,value;
	QColor FillColor;
	bool flag;
};

Wait::Wait(QWidget *parent) : QWidget(parent)
{
	value = 0;
	flag = true;

	startTimer(50);
}

Wait::~Wait()
{

}

void Wait::timerEvent(QTimerEvent *)
{
	if(value < 360)
	{
		value += 20;
	}
	else
	{
		value = 0;
		flag = !flag;
	}
	update();
}

void Wait::paintEvent(QPaintEvent *)
{
	initParameter();

	QPainter painter(this);
	painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing);
	drawFillColor(&painter);
	drawAssist(&painter);
}

void Wait::drawAssist(QPainter *painter)
{
	painter->save();
	/************************************************************************/
	painter->setPen(QColor(Qt::transparent));
	painter->setBrush(QColor(213,249,239));
	painter->drawEllipse(center,inRadius,inRadius);
	/************************************************************************/
	painter->restore();
}

void Wait::drawFillColor(QPainter *painter)
{
	painter->save();
	/************************************************************************/
	QRectF rectangle(outRadius*0.05,outRadius*0.05, outRadius*2,outRadius*2);

	int startAngle = 0;
	int spanAngle =  0;
	if(flag)
	{
		startAngle = 90 * 16;
		spanAngle = -value * 16;
	}
	else
	{
		startAngle = (90-value) * 16;
		spanAngle = (-360+value) * 16;
	}
	
	painter->setBrush(FillColor);
	painter->setPen(QColor(Qt::transparent));
	painter->drawPie(rectangle, startAngle, spanAngle);
	/************************************************************************/
	painter->restore();
}

void Wait::initParameter()
{
	center = QPointF(this->width()/2.0 , this->height()/2.0);

	outRadius = this->height() / 2.0 * 0.95;
	inRadius = this->height() / 2.0 * 0.75;

	fillColor();
}

void Wait::fillColor(QColor color)
{
	FillColor = color;
}
  • 源码链接稍后上传、或查看下面公众号获取。
关注

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

笔者 - jxd

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

猜你喜欢

转载自blog.csdn.net/automoblie0/article/details/100015178