当前位置:嗨网首页>书籍在线阅读

13-定时器的使用

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

4.4.4 定时器的使用

Qt中的定时器类是QTimer。QTimer不是一个可见的界面组件,在UI 设计器的组件面板里找不到它。实例程序实现了一个计时器的功能,就是计算定时器开始到停止持续的时间长度,计时器是QTime类。

QTimer主要的属性是interval,是定时中断的周期,单位毫秒。QTimer主要的信号是timeout(),在定时中断时发射此信号,要想在定时中断里做出响应,这就需要编写timeout()信号的槽函数。下面是窗口类中增加的定义(省略了其他不相关的定义):

class Dialog : public QDialog
{
private:
   QTimer *fTimer;  //定时器
   QTime fTimeCounter;//计时器
private slots:
   void on_timer_timeout(); //定时溢出处理槽函数
};

这里定义了一个定时器fTimer,一个计时器fTimeCounter。还定义了一个槽函数on_timer_timeout(),作为定时器的timeout()信号的响应槽函数。

需要在窗口类的构造函数里创建定时器,并进行信号与槽的关联。代码如下:

Dialog::Dialog(QWidget *parent) :   QDialog(parent),   ui(new Ui::Dialog)
{
   ui->setupUi(this);
   fTimer=new QTimer(this); 
   fTimer->stop();
   fTimer->setInterval(1000);//设置定时周期, 单位:毫秒
   connect(fTimer,SIGNAL(timeout()),this,SLOT(on_timer_timeout())); 
}

槽函数on_timer_timeout()的实现代码如下:

void Dialog::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();
   va++;
   if (va>100)
      va=0;
   ui->progressBar->setValue(va); 
}

这段代码首先用QTime类的静态函数QTime::currentTime()获取当前时间,然后用QTime的成员函数hour()、minute()、second()分别获取小时、分钟、秒,并在几个LCDNumber组件上显示。循环更新progressBar的值,是为了让界面有变化,表示定时器在运行。

设置定时器的周期,只需调用QTimer::setInterval()函数即可。

QTimer::start()函数用于启动定时器,界面上的“开始”按钮代码如下:

void Dialog::on_btnStart_clicked()
{
   fTimer->start();//定时器开始工作
   fTimeCounter.start();//计时器开始工作
   ui->btnStart->setEnabled(false); 
   ui->btnStop->setEnabled(true);
   ui->btnSetIntv->setEnabled(false);
}

计时器fTimeCounter执行start()是将当前时间作为计时器的时间。

QTimer::stop()函数停止定时器,界面上的“停止”按钮可实现这一功能,其代码如下:

void Dialog::on_btnStop_clicked()
{
   fTimer->stop(); //定时器停止
   int tmMsec=fTimeCounter.elapsed();//毫秒数
   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);
}