用qt做一个简易的时钟,主要涉及到qt中的定时器事件,画图事件
"widget.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
void paintEvent(QPaintEvent *event);
void timerEvent(QTimerEvent *event);
private:
int h = 0, m = 0, s = 0; //定义三个变量来存储时,分,秒
int timer; //存储计时器返回的序号
};
“widget.cpp”
1、构造函数中初始化定时器,并用currentTime方法访问系统当前时间,存储到定义的变量中
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
timer = startTimer(1000);
QTime nowtime = QTime::currentTime();
h = nowtime.hour();
m = nowtime.minute();
s = nowtime.second();
}
2、构造定时器事件
void Widget::timerEvent(QTimerEvent *event)
{
s++;
if (s == 60)
{
s = 0;
m++;
if (m == 60)
{
m = 0;
h++;
if (h == 24)
{
h = 0;
}
}
}
}
掌握时间中进制转换的规律,对时分秒进行转换即可
1day = 24h 1h = 60m 1m = 60s (每个单位进位以后记得归零)
3、构造绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this); //必须在绘图事件中定义才会被激活
painter.setRenderHint(QPainter::Antialiasing,true); //消除锯齿
QPen mypen(Qt::black,3); //构建一只画笔mypen
painter.setPen(mypen); //使用画笔
QPoint center(this->width()/2,this->height()/2); //定点到画布的中心位置
painter.translate(center); //利用translate函数将原点定位到中心位置
QPoint cen(0,0);
//painter.drawEllipse(cen,200,200); //绘制时钟的外围
//绘制小时的刻度线
for(int i=0;i<12;i++)
{
painter.rotate(30);
painter.drawLine(0,-180,0,-200);
}
//绘制分钟的刻度线
for(int i=0;i<60;i++)
{
painter.rotate(6);
painter.drawLine(0,-190,0,-200);
}
painter.end();
QPainter painters(this); //定义一个画家来控制秒针
painters.setRenderHint(QPainter::Antialiasing,true);
mypen.setWidth(1);
painters.setPen(mypen);
painters.translate(center);
painters.rotate(s*6); //秒针每次转6°
painters.drawLine(0,0,0,-150); //画出秒针
painters.end();
QPainter painterm(this); //定义一个画家来控制分针
painterm.setRenderHint(QPainter::Antialiasing,true);
mypen.setWidth(4);
mypen.setColor(Qt::blue);
painterm.setPen(mypen);
painterm.translate(center);
painterm.rotate(m*6); //分针每次转6°(一小格)
painterm.drawLine(0,0,0,-150);
painterm.end();
QPainter painterh(this); //定义一个画家来控制时针
painterh.setRenderHint(QPainter::Antialiasing,true);
mypen.setWidth(7);
mypen.setColor(Qt::red);
painterh.setPen(mypen);
painterh.translate(center);
painterh.rotate(h*30+m*0.5); //时针每小时偏移30°并在原来的基础上每分钟偏移0.5°
painterh.drawLine(0,0,0,-100);
painterh.end();
update(); //刷新绘图事件
}
一定要用update来不断刷新绘图事件才会呈现出动态效果
效果图展示: