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; //退出系统
}
*/
}