天天看點

Qt重繪控件之等待

Qt重繪控件之等待條(來自京東重新整理gif)

閑來無事制作重繪控件工作

效果如圖: (因為錄制幀原因,效果不佳)

Qt重繪控件之等待

源碼

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;
}
           

關注

筆者 - jxd
微信公衆号搜尋 “碼農總動員” 或 微信掃描下方二維碼,了解更多你不知道的XX,O(∩_∩)O
Qt重繪控件之等待

繼續閱讀