时钟模块
思路:利用Qt中的paintEvent画出时钟再利用timerEvent使时钟走起来
1、初始化绘图工具、设置圆心、半径
//绘图工具
QPainter painter(this);
QPen pen = painter.pen();
pen.setColor(QColor(12,34,56));
pen.setWidth(5);
painter.setPen(pen);
//圆心
QPoint center(this->width()/2,this->height()/2);
//半径
int radius;
if(this->width() <= this->height())
{
radius=this->width()/2-5;
}
else
{
radius=this->height()/2-5;
}
2、绘制表盘
//画刻度
int end = radius-5;
int start = end-radius/10;
painter.translate(center);
for(int i=0; i<60; i++)
{
if(i%5==0)
{
pen.setColor(QColor(255,34,56));
pen.setWidth(radius*7/145);
painter.setPen(pen);
painter.rotate(6*i);
painter.drawLine(0,-start+5, 0, -end);
painter.rotate(-6*i);
}else
{
pen.setColor(QColor(66,34,56));
pen.setWidth(radius*5/145);
painter.setPen(pen);
painter.rotate(6*i);
painter.drawLine(0,-start, 0, -end);
painter.rotate(-6*i);
}
}
painter.translate(-center.x(),-center.y());
painter.drawEllipse(center,radius,radius); //画外圆
painter.drawEllipse(center,3,3);//画圆心
3、根据时间分别画出时针、分针、秒针
double hr = _time.hour()*30+_time.minute()/60.0*30+_time.second()/3600.0*30;
double mr = _time.minute()*6+_time.second()/60.0*6;
double sr = _time.second()*6;
//把坐标系移动到圆心
painter.translate(center);
//画时针
pen.setColor(QColor(255,34,56));
pen.setWidth(radius*8/145);
pen.setCapStyle(Qt::RoundCap);
painter.setPen(pen);
painter.rotate(hr);
painter.drawLine(0,0, 0,-radius/3);
painter.rotate(-hr);
//画分针
pen.setColor(QColor(12,255,56));
pen.setWidth(radius*6/145);
painter.setPen(pen);
painter.rotate(mr);
painter.drawLine(0,0, 0,-radius/2);
painter.rotate(-mr);
//画秒针
pen.setColor(QColor(12,34,255));
pen.setWidth(radius*4/145);
painter.setPen(pen);
painter.rotate(sr);
painter.drawLine(0,0, 0,-radius*2/3);
painter.rotate(-sr);
//画圆心
pen.setColor(QColor(12,34,56));
pen.setWidth(radius*6/145);
painter.setPen(pen);
painter.drawEllipse(QPoint(0,0),5,5);//画圆心
painter.translate(-center.x(),-center.y());
4、提供一个函数用来设置绘制的时间
void TimeClockWidget::setTime(const QTime &time)
{
_time = time;
update();
}
5、按照秒数每秒加一使秒针一秒一跳
void TimeClockWidget::timerEvent(QTimerEvent *event)
{
_time = _time.addSecs(1);
setTime(_time);
ui->timeLb->setText(_time.toString());
}
这样一个随时间走动的时钟就写好了,今天给大家讲解了时钟模块的源码解析,接下来我会继续更新整个项目的详细讲解,感兴趣的小伙伴可以点波关注互相学习交流(大佬勿喷)不方便在C站下载源码的小伙伴可以私聊我哦