Qt中有一个模拟时钟的例题,其主要实现的功能只有时针和分针,以及时钟的那些刻度线。博主在其基础上多增加了秒针,以及数字的显示。同时,对其中小部分进行修改。本例题主要是了解和练习使用QTimer类。本例题属于还是比较简单的,代码量也是很少。具体的代码和解释可以查看git(基本知识点都有注释):“https://github.com/Iconzjy/Qt-Example.git”中的analogclock。最终实现效果如图:
本程序先创建一个Non-Qt Project项目,在pro文件内添加QT+=widgets,接着创建main.cpp以及AnalogClock类。一下就先讲解主要的代码。
AnalogClock类的构造函数实现
AnalogClock::AnalogClock(QWidget *parent) : QWidget(parent)
{
//计时器timer
QTimer *timer = new QTimer(this);
//timeout() 是QTimer中的一个私有非静态函数,不能由用户自己发出
connect (timer, SIGNAL(timeout()), this, SLOT(update()));
connect (timer, SIGNAL(timeout()), this, SLOT(timeChange()));
//启动或重新启动计时器,函数参数单位为毫秒,
timer->start(1000);
setWindowTitle (tr("Analog Clock"));
resize (400,200);
//获取当前时间
QTime time = QTime::currentTime();
//设置label的布局
//具体怎么布局看个人需要了,这里只是简单的显示下。
QVBoxLayout* layout=new QVBoxLayout;
QString text = time.toString ();
label = new QLabel();
label->setText (text);
layout->addWidget (label);
layout->setAlignment (label,Qt::AlignVCenter);
this->setLayout (layout);
}
其中connect (timer, SIGNAL(timeout()), this, SLOT(timeChange()));的作用是显示数字的时间。效果如图:
在虚函数void AnalogClock::paintEvent(QPaintEvent* /*event*/)中,多添加for循环的第三行就可以实现1-12这12个数的显示了。
//画时钟边界上每5小格的刻度线,设置数字
for(int i = 0; i < 12; ++i){
painter.drawLine (0,88,0,96);
painter.rotate(30.0);
painter.drawText(-3,-80,tr("%1").arg(i+1));
}
秒针的实现和时针,分针的实现基本一样,就不再写了。
具体的代码和解释请自行到链接里下载。