2021.6.6:QT——定时器及实现

定时器是用来处理周期性事件的一种对象。
如果设置一个定时器的定时周期为1000ms,那么每1000ms就会发射定时器的timeout()信号,在信号关联的槽函数中就可以做相应的处理。
Qt中的定时器类是QTimer。QTime在UI设计器中并不可见。上一节的程序中实现了一个计时器的功能,就是计算定时器开始到停止,持续的时间长度,计时器是QTime类。
QTimer主要属性是interval,是定时中断的周期,单位毫秒。QTimer主要的信号是timeout(),在定时中断时发射该信号,要想在定时中断中做出响应,这就需要编写timeout()信号的槽函数。下面是在窗口类中增加的定义:
class Widget : public QWidget { private slots: void on_timer_timeout(); //定时中断处理的槽函数 private: QTimer * fTimer; //定时器 QTime fTimeCounter;//计时器 };
这里定义了一个定时器 fTimer,一个计时器 fTimeCounter。还定义了一个槽函数 on_timer_timeout(),作为定时器的timeout()信号的响应槽函数。
需要在窗口类的构造函数中创建定时器,并进行信号与槽的关联,代码如下:
Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); fTimer = new QTimer(this); fTimer->stop(); fTimer->setInterval(1000);//设置定时周期,单位:ms connect(fTimer,SIGNAL(timeout()),this,SLOT(on_timer_timeout())); }
槽函数on_timer_timeout()的实现代码如下:
void Widget::on_timer_timeout(){ //定时器中断响 QTime curTime = QTime::currentTime();//获取当前时间 ui->LCDHour->display(curTime.hour());//显示小时 ui->LCDMin->display(curTime.minute()); ui->LCDSec->display(curTime.second()); int va = ui->progressBar->value(); if(va++>100){ va=0; } ui->progressBar->setValue(va); }
这段代码首先用QTime的静态函数QTime::currentTime()获取当前时间,然后用QTime的成员函数hour()、minute()、second()分别获取小时、分钟、秒,并在几个LCDNumber组件上显示。
循环更新progressBar的值,是为了让界面有变化,表示定时器在运行。
设置定时器的周期,只需要调用QTimer成员函数setInterval()函数即可。
QTimer::start()用于启动定时器,界面上的“开始”按钮代码如下:
void Widget::on_btnStart_clicked() { fTimer->start();//定时器开始工作 fTimeCounter.start();//计时器开始工作 ui->btnStart->setEnable(false); ui->btnStop->setEnabled(true); ui->btnSetIntv->setEnabled(false); }
计时器fTimerCounter执行start()是将当前时间作为计时器的时间。
QTimer::Stop()函数停止定时器,界面上的“停止”按钮可以实现这一功能,其代码如下:
void Widget::on_btnStop_clicked() { fTimer->stop();//定时器停止 int tmMsec = fTimeCounter.elapsed();//ms数 int ms = tmMsec%1000; int sec = tmMsec/1000; QString str = QString::asprintf("流逝时间:%d 秒,%d 毫秒",sec,ms); ui->LabElapsTime->setText(str); ui->btnStart->setEnabled(true); ui->btnStop->setEnabled(false); ui->btnSetIntv->setEnabled(true); }
总结
1、定时器类:QTimer——每隔一定时间发送timeout()信号;
- QTimer的主要属性interval,定时中断周期,单位ms;
- 主要信号timeout(),在定时中断时发送该信号;
- 中断时的响应函数就是这个信号的槽函数。
2、QTimer没有UI控件,只能在窗口类中定义它:
class Widget : public QWidget{ ... private: QTimer * fTimer; }
3、定时器QTimer一般与计时器同时出现,计时器一般用QTime就可以;此外定时器中断响应函数也需要手写,作为timeout()的响应函数:
class Widget : public QWidget { private slots: void on_timer_timeout(); private: QTimer * fTimer; //定时器 QTime fTimeCounter;//计时器 }
QTimer实例化、timeout()信号与中断响应函数on_timer_timeout()的关联都是在窗体里的Constructor中进行:
Widget :: Widget(QWidget * parent): : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); fTimer = new QTimer(this);//实例化 fTimer->stop();//停止计时 fTimer->setInterval(1000);//设置周期 connect(fTimer,SIGNAL(timeout()),this,SLOT(on_timer_timeout()));//timeout中断信号与中断响应函数的连接 }
4、定时器开始、结束的方法分别是:
fTimer -> start();
fTimer -> stop();
5、计时器的开始计时的方法是:
fTimeCounter.start();
这句话的实际意义是,将当前时间作为计时器时间。
获取计时器从开始到现在流逝的时间(单位ms):
int tmMsec = fTimeCounter.elapsed(); //ms int ms = tmMsec%1000; int sec = tmMsec/1000;
6、使按钮Button有效、无效化:setEnabled(bool):
ui->btnStart->setEnable(false); ui->btnStop->setEnable(true);

浙公网安备 33010602011771号