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

發佈了44 篇原創文章 · 獲贊 0 · 訪問量 5407
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章