在QT5中,我们有一个专门的计时器类,QTimer,我们可以利用它完成一些关于定时的操作,实例如下:
1 2 3 4 5 6 7 8 9 10 11 | #include <QTimer> QTimer* timer = new QTimer(); timer->start(value); //以毫秒为单位 QObject::connect(timer,&QTimer::timeout,receiver,&slot); //时间结束,发送timeout信号 void slot() {<!-- --> timer->stop(); //停止计时器 //do something } |
在我们定时时间结束的时候,我们需要手动停止timer,不然他会不断发送出timeout这个信号,同时,我们需要注意,在做连接函数之前,我们需要存在这个timer的实例,不然会导致程序崩溃,当然我们也可以不需要实例化timer,而是使用QTimer的静态方法,直接起动定时,一下是QT文档中的一个例子:
1 2 3 4 5 6 7 8 9 10 | #include <QApplication> #include <QTimer> int main(int argc, char *argv[]) {<!-- --> QApplication app(argc, argv); QTimer::singleShot(600000, &app, SLOT(quit())); //使用静态方法,在600秒之后退出程序 ... return app.exec(); } |
我们可以在一个程序之中使用多个timer,每一个timer都是有着自己独自的timerId,和window进程的pid类似,我们可以利用timerEvent来处理多个timer:
1 2 3 4 5 6 7 | void timerEvent(QTimerEvent* event) {<!-- --> if(event->timerId() == timerId) //使用if来判断是那个timer发出的信号 {<!-- --> // do something } } |
参考:QTimer计时器
程序设计的思路:
- 先设定定时周期
- 绑定timeout()信号到自定义槽函数
- 调用start函数启动定时器
下面是widget窗口类中的定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Widget : public QWidget {<!-- --> Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); private: Ui::Widget *ui; QTimer *tim; public slots: void onTimeOut(); }; |
在这里定义了一个QTimer,还定义了槽函数onTimeOut(),作为timeout信号所对应的槽函数。
窗口类的构造函数中的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {<!-- --> ui->setupUi(this); tim = new QTimer(); tim->setInterval(100); connect(tim,SIGNAL(timeout()),this,SLOT(onTimeOut())); //connect(tim, &QTimer::timeout, this, &Widget::onTimeOut); tim->start(); } |
在本例中先是设置定时器的定时周期为1s,后面又进行了信号与槽的绑定,最后是启动定时器。
定时器处理函数中的代码如下:
1 2 3 4 5 6 7 8 | void Widget::onTimeOut() {<!-- --> static int value = 0; ui->progressBar->setValue(value++); if(value > 100) tim->stop(); } |
参考:Qt之QTimer(定时器)