qt/LedOK/wProgramManager/wEditProgram/wElement/fyxcircleprogress.cpp
2022-01-04 18:11:48 +08:00

104 lines
3.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "fyxcircleprogress.h"
fyxCircleProgress::fyxCircleProgress(QWidget *parent) :
QWidget(parent)
{
setAttribute(Qt::WA_DeleteOnClose);
m_updateTimer = new QTimer(this);
m_updateTimer->setInterval(50);//间隔,微妙微单位,大家可以改一下这个值看看转动速度。
connect(m_updateTimer,SIGNAL(timeout()),this,SLOT(UpdateAngle()));
m_updateTimer->start();//启动定时器
m_angle = 0;
m_outerRadius = 0;
setWindowFlags(Qt::FramelessWindowHint);//无窗体
setAttribute(Qt::WA_TranslucentBackground);//背景透明
}
void fyxCircleProgress::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing|QPainter::HighQualityAntialiasing);//设置反锯齿
drawUnderCircle(&painter);//画外部圆
// drawBMW(&painter);//画宝马
}
void fyxCircleProgress::drawUnderCircle(QPainter *painter)
{
painter->save();
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);//大家可以注释掉这行看一下,有什么差别?
QRadialGradient CircleGradient(CircleRect.center(),m_outerRadius,CircleRect.center());//设置渐变
CircleGradient.setColorAt(0.0,OUTER_CIRCLE_START_COLOR);
CircleGradient.setColorAt(1.0,OUTER_CIRCLE_END_COLOR);
painter->setBrush(CircleGradient);
painter->drawEllipse(CircleRect);//画椭圆,其实就是画圆。特殊椭圆而已
painter->restore();
}
void fyxCircleProgress::drawBMW(QPainter *painter)
{
painter->save();
//坐标转换的方法和下面直接用painter的rotate方法一样
//QTransform t;
//t.translate(rect().center().x(),rect().center().y());// move to center
//t.rotate(m_angle,Qt::ZAxis);//绕Z轴旋转
//painter->setTransform(t);
painter->translate(rect().center().x(),rect().center().y());// move to center
painter->rotate(m_angle);//旋转
qreal InnerRadius = m_outerRadius * RADIUS_FACTOR;//内半径
QPointF tTopLeft( -InnerRadius,-InnerRadius);
QPointF tBottomRight(InnerRadius,InnerRadius);
QRectF tRect(tTopLeft,tBottomRight);
qreal dAngle = 90 * 16;//为什么乘以16自己查看文档怎么画pie的。
qreal StartAngle = 0;
painter->setPen(Qt::NoPen);
for(int AngleIndex = 0; AngleIndex < 4;AngleIndex++)
{
//交叉蓝色白色
QRadialGradient PieGradient(tRect.center(),m_outerRadius,tRect.center());
if(AngleIndex%2)//蓝色
{
PieGradient.setColorAt(0.0,BLUE_CIRCLE_START_COLOR);
PieGradient.setColorAt(1.0,BLUE_CIRCLE_END_COLOR);
}
else//白色
{
PieGradient.setColorAt(0.0,WHITE_CIRCLE_START_COLOR);
PieGradient.setColorAt(1.0,WHITE_CIRCLE_END_COLOR);
}
painter->setBrush(PieGradient);
painter->drawPie(tRect,StartAngle,dAngle);
//角度增加90度
StartAngle += dAngle;
}
painter->restore();
}
void fyxCircleProgress::UpdateAngle()
{
m_angle += 1;
if(m_angle > 360)
{
m_angle = 0;
}
//m_angle = ((m_angle + 1) % 360);与上面几行功能一样
update();//刷新控件会调用paintEvent函数
}