2021.6.6:QT——定时器及实现

 

定时器是用来处理周期性事件的一种对象。

如果设置一个定时器的定时周期为1000ms,那么每1000ms就会发射定时器的timeout()信号,在信号关联的槽函数中就可以做相应的处理。

Qt中的定时器类QTimerQTime在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);

 

posted @ 2021-06-06 20:54  ShineLe  阅读(1313)  评论(0)    收藏  举报