先上效果图
一.钟表实现原理
设置定时器timer,每隔1000毫秒(即1s)发送timeout()信号到槽函数update(),重绘事件函数paintEvent(QPaintEvent*event)
QTimer*timer=new QTimer(this);
timer->start(1000);
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
二.钟表的绘制
拆分钟表:表盘 数字 刻度线 指针
paintEvent(QPaintEvent*event)
1.表盘
painter.setPen(QPen(Qt::white,5,Qt::DashLine,Qt::RoundCap));
painter.drawEllipse(50,90,500,500);
2.十二个数字
int r=250;
for (int i=1;i<=12;i++) {
painter.drawText(287+r*0.77*sin(2*PI/12*i),355-r*0.77*cos(2*PI/12*i),QString::number(i));
}
注意:要注意界面x,y轴的正方向
(如果用旋转坐标轴的方法实现数字的位置,1-12的数字不能正向站立,不建议使用)
3.刻度线
painter.translate(300,340);
painter.save();
//时段线
for (int i=0;i<4;++i) {
painter.drawLine(220,0,250,0);
painter.rotate(90);
}
//小时线
painter.setPen(QPen(Qt::white,3,Qt::DashLine,Qt::RoundCap));
for (int i=0;i<12;++i) {
painter.drawLine(230,0,250,0);
painter.rotate(30);
}
painter.restore();
通过旋转坐标轴的方法绘制刻度线
4.指针
时针为例
//绘制针
static QPoint hourhand[4]={
QPoint(12,14),QPoint(0,25),QPoint(-12,14),QPoint(0,-100)};
确定针的点,再用 painter.drawConvexPolygon()函数绘制。
三.钟表转动实现
通过转动坐标轴,来实现即时绘制。
还是以时针转动为例。
QTime time=QTime::currentTime();//获取当前系统时间
painter.save();
//时针转动
painter.setPen(Qt::NoPen);
painter.setBrush(QColor(240,140,40,150));
painter.rotate(30*((time.hour()+time.minute()/60)));
painter.drawConvexPolygon(hourhand,4);
painter.restore();
这样一个简单的钟表就实现啦!~
若有不足欢迎大家多多指出,第一次写博客,内心有亿、、激动。