qt linux定时器最小精度,Qt中定时器TimerID的小总结

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

}

*/

}0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt提供了两种类型的定时器:基于事件循环的 QTimer 和基于时间的 QBasicTimerQTimer 是一个基于事件循环的定时器,它在指定的时间间隔后发出 timeout() 信号。它可以是单次定时器,也可以是重复定时器。 下面是一个使用 QTimer 的例子: ```cpp #include <QApplication> #include <QLabel> #include <QTimer> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel label("0"); label.show(); QTimer timer; timer.start(1000); // 1秒钟触发一次timeout()信号 int count = 0; QObject::connect(&timer, &QTimer::timeout, [&]() { label.setText(QString::number(++count)); }); return app.exec(); } ``` QBasicTimer 是一个基于时间定时器,它通过重写 QObject::timerEvent() 函数来实现定时器功能。QBasicTimer 没有 start() 和 stop() 函数,而是通过 QCoreApplication::postEvent() 函数来启动和停止定时器。 下面是一个使用 QBasicTimer 的例子: ```cpp #include <QApplication> #include <QLabel> #include <QBasicTimer> class MyWidget : public QWidget { public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) { label.setText("0"); label.show(); timer.start(1000, this); // 1秒钟触发一次定时器事件 } protected: void timerEvent(QTimerEvent *event) override { if (event->timerId() == timer.timerId()) { label.setText(QString::number(++count)); } } private: QLabel label; QBasicTimer timer; int count = 0; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget; widget.show(); return app.exec(); } ``` 以上就是使用 QTimer 和 QBasicTimer 实现定时器的方法。需要注意的是,QTimer 是基于事件循环的定时器,因此在长时间的计算或阻塞操作可能会出现延迟或不准确的情况;而 QBasicTimer 是基于时间定时器,更加准确,但需要手动实现定时器事件的处理函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值