一、显示效果
1.显示实时时间
2.实现计时、暂停、重置、打点
二、使用库、函数
需要使用下面这两个库其中QTime是代表事件类的,比如获取现在的时间,或者时间增加,QTimer是定时器类的函数,其中包含了开始定时,暂停定时等。
#include <QTime>
#include <QTimer>
使用函数:
设置时间值:setHMS(int h, int m, int s, int ms),元素代表小时、分、秒、毫秒
获取现在时间:QTime::currentTime();
开启定时器计时start(30);计时30ms,每到30ms会触发信号timeout()
增加时间值:addMSecs(30);
暂停定时器:stop();
其他函数: buf = buf.asprintf("%d:",i);,i是一个int类型变量,将其转换为buf所在类型变量,比如这里的buf是QString类型,因此就是把i变为QString类型
三、ui界面的实现
其中现在时间和计时器时间显示界面用的是label组件,label组件也可以进行写入,使用函数setText()
ui ->timertxt->setText(qtime->toString("hh:mm:ss:zzz"));
显示框用的是Plain Text Edit需要选择readonly,其余按钮采用pushbuttton
四、 逻辑功能实现
4.1实时时间显示
在头文件中定义:
QTime *qtime;
QTime *current_time;
QTimer *qtimer;
QTimer *current_timer;
在Widget的构造函数中我们初始化一个current_time = new QTime和current_timer =new QTimer分别作为现在时间值和现在时间用的定时器,这里我们将*current_time赋值为现在时间,并开启现在时间定时器
*current_time = QTime::currentTime();
current_timer->start(30);
然后将现在时间显示到ui上
ui ->nowtimetxt->setText(current_time->toString("hh:mm:ss"));
使用setText将时间转化为String格式并且是“hh:mm:ss”就是10:50:30代表10点50分30秒
这时我们将timeout()信号量关联到其槽函数,以便于更新我们的实时时间
connect(current_timer,SIGNAL(timeout()),this,SLOT(now_time_SLOT()));
我们需要将槽函数now_time_SLOT()函数放在头文件的private slots:中,因为这是手动关联的槽函数,自动关联的槽函数系统会帮我们自动放入
下面是我们的槽函数,就是每30ms进入中断槽函数的时候我们只需要将*current_time增加30ms即可,因为这是特殊的类型并不是int,因此我们不能直接加减而是使用其库提供的函数,然后将新的数值更新在显示界面即可
void Widget::now_time_SLOT()
{
*current_time = current_time->addMSecs(30);
ui->nowtimetxt->setText(current_time->toString("hh:mm:ss"));
}
4.2 计数器功能开始、暂停
与上述实时时间显示功能类似,也是通过显示初始值,开启定时器,增加时间,再显示来完成的,不同的就是这里开启定时器在开始按键的槽函数中实现。
先将初始时间设置为0,0,0,0,然后显示到界面,然后关联槽函数
qtime ->setHMS(0,0,0,0);
//label使用setText来设置
ui->timertxt->setText("00:00:00:00");
//设置定时器槽函数
connect(qtimer,SIGNAL(timeout()),this,SLOT(timeout_slot()));
这里我们只需要将开关按键槽函数分别设置为开关定时器即可,当定时器时间到达,上述槽函数会触发,然后再对时间进行增加,更新即可
void Widget::on_startbt_clicked()
{
qtimer->start(30);
}
void Widget::on_stopbt_clicked()
{
qtimer->stop();
}
void Widget::timeout_slot()
{
*qtime = qtime->addMSecs(30);
ui ->timertxt->setText(qtime->toString("hh:mm:ss:zzz"));
}
4.3 重置
首先我们暂停定时器,然后将显示值清零即可,这里我们把后面打点的界面也清除了
void Widget::on_resetbt_clicked()
{
qtimer->stop();
qtime ->setHMS(0,0,0,0);
ui ->timertxt->setText(qtime->toString("hh:mm:ss:zzz"));
ui->plainTextEdit->clear();
}
4.4打点
打点操作为了记录现在是打的第几个点、打点的相对时间
void Widget::on_bitbt_clicked()
{
i++;
QString buf;
buf = buf.asprintf("%d:",i);
ui ->plainTextEdit->appendPlainText(buf);
ui->plainTextEdit->appendPlainText(qtime->toString("hh:mm:ss:zzz"));
}