Qt中定时器TimerID的小总结

Qt中定时器的使用方法

1,如果就用一两个定时器,可以直接使用关联槽函数。

     相关教程中 例如:

(1)在 mainwindow.h 中添加槽函数声明。

private slots: 
void timerUpDate(); 

(2)在 mainwindow.cpp 中添加代码。

添加#include <QtCore>的头文件包含,这样就包含了QtCore下的所有文件。
构造函数里添加代码:
 

QTimer *timer = new QTimer(this); //新建定时器 
connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate())); //关联定时器计满信号和相应的槽函数 
timer->start(1000); //定时器开始计时,其中1000表示1000ms即1秒 


(3)然后实现更新函数。

void MainWindow::timerUpDate() 
{ 
QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间 
QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd"); //设置系统时间显示格式 
ui->label->setText(str); //在标签上显示时间 
}


2,如果要用多个定时器,可以根据定时器的返回值TimerID来确定该执行哪个情况

教程中,有这样的代码:在构造函数里添加以下代码。

startTimer(1000); //其返回值为1,即其timerId 为1 
startTimer(5000);//其返回值为2,即其timerId为2 
startTimer(10000); //其返回值为3,即其timerId 为3 

添加了三个定时器,它们的 timerId 分别为1,2,3。注意,第几个定时器的返回值就为几。所以要注意定时器顺序。
在下面添加函数实现。

void MainWindow::timerEvent(QTimerEvent *t) //定时器事件 
{ 
switch(t->timerId()) //判断定时器的句柄 
{ 
case 1 : ui->label->setText(tr("每秒产生一个随机数:%1").arg(qrand()%10));break; 
case 2 : ui->label_2->setText(tr("5秒后软件将关闭"));break; 
case 3 : qApp->quit();break; //退出系统 
} 
} 


但是,上面的代码却不能执行出正确结果。case 1能执行,case 2 和 case 3 却不执行。

原因是:第一个定时器返回值TimerID是1,但其他两个定时器TimerID并不一定是2和3Qt中定时器的的返回值是

要经过分配算法计算后才分配的,因此上面那种使用方法并不对!

正确的一种方法可以这样:

用id1 、id2、 id3记录下返回值

id1 = startTimer(1000); //其返回值为id1,即其timerId 为1
id2 = startTimer(5000); //其返回值为id2,id2是定时器分配算法后的结果,具体值并不知道
id3 = startTimer(10000); //其返回值为id3,即其timerId 为3


然后,在TimerEvent()中进行判断。

void MainWindow::timerEvent(QTimerEvent * t)

{
    //    qDebug() << "Timer ID:" << t->timerId();
    int id = t->timerId(); //判断定时器的句柄
     if(id == id1) ui->label->setText(tr("每秒产生一个随机数:%1").arg(qrand()%10));
    if(id == id2) ui->label_2->setText(tr("5秒后软件将关闭"));
    if(id == id3) qApp->quit();
    //else QMessageBox::about(NULL,"","");
    /* 教程上,本段代码有问题,并不能保证定时器的ID为1、2、3 因此替换成上面那段代码
    switch(t->timerId()) //判断定时器的句柄
    {
    case 1 : ui->label->setText(tr("每秒产生一个随机数:%1").arg(qrand()%10));break;
    case 2 : ui->label_2->setText(tr("5秒后软件将关闭"));break;
    case 3 : qApp->quit();break; //退出系统
    }
    */
}


 

 

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值