在Qt中使用定时器有两种方法,QTimer类的定时器和基于QObiect类的定时器。定时器的精确性依赖于操作系统和硬件(主要是操作系统),大多数平台支持20ms的精确度,实测Win10的精度基本就是20毫秒左右(硬件高配)。
一、Qtimer类的定时器
#include <QTimer>
使用定时器的三步,在timerUpDate函数中编写定时器的处理函数,
QTimer* timer = new QTimer(this); //定时器的常规用法
connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));
timer->start(1000);
二、QObject类的定时器
QObject类提供的定时器功能相关的成员函数有:startTimer()、timeEvent()、killTimer()。其中startTimer()和timerEvent()原型及说明如下:
int QObject::startTimer(int interval);
开始一个定时器并返回定时器ID,如果不能开始一个定时器,将返回0。定时器开始后,每隔interval毫秒间
隔将触发一次超时事件,直到killTimer()被调用来删除定时器。如果interval为0,那么定时器事件每次发生时没有窗口系统事件处理。
virtual voidQObject::timerEvent(QTimerEvent *event);
虚函数timerEvent()被重载来实现用户的超时事件处理函数。如果有多个定时器在运行,QTimerEvent::timerId() 被用来查找指定定时器,并对其进行操作。当定时器事件发生时,虚函数timerEvent()随着QTimerEvent事件参数类一起被调用,重载这个函数可以获得定时器事件。
QObject类的定时器的基本用法如下:
在某个需要使用定时器的类中调用startTimer函数
startTimer(2000);
startTimer(5500);
startTimer(10500);
重载定时器事件处理函数,在函数中添加事件处理的代码即可。
void timerEvent(QTimerEvent* t); //定时器事件重载函数
三、综合实例
头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
#include <QPlainTextEdit>
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow();
~MainWindow();
QPlainTextEdit* plainTextEdit;
public slots:
void timerUpDate(); //与定时器常规用法的槽函数
void timerEvent(QTimerEvent* t); //定时器事件重载函数
};
#endif // MAINWINDOW_H
源代码
#include <QHBoxLayout>
#include <QDateTime>
#include <QTimer>
#include <QDebug>
#include "MainWindow.h"
MainWindow::MainWindow()
{
plainTextEdit = new QPlainTextEdit;
QHBoxLayout* layout = new QHBoxLayout(this);
layout->addWidget(plainTextEdit);
layout->setParent(this);
QTimer* timer = new QTimer(this); //定时器的常规用法
connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));
timer->start(1000);
startTimer(2000);
startTimer(5500);
startTimer(10500);
// int ID1 = startTimer(2000);
// int ID2 = startTimer(5500);
// int ID3 = startTimer(10500);
// qDebug() << ID1 << endl;
// qDebug() << ID2 << endl;
// qDebug() << ID3 << endl;
}
void MainWindow::timerUpDate()
{
QDateTime time = QDateTime::currentDateTime();
qDebug() << time;
QString timeStr = time.toString("yyyy-MM-dd dddd hh:mm:ss");
plainTextEdit->appendPlainText(timeStr);
}
void MainWindow::timerEvent(QTimerEvent *t)
{
QDateTime time = QDateTime::currentDateTime();
QString timeStr = time.toString("yyyy-MM-dd dddd hh:mm:ss");
switch (t->timerId())
{
case 1:
plainTextEdit->appendPlainText(timeStr + tr(" timerId = %1").arg(t->timerId()));
break;
case 2:
plainTextEdit->appendPlainText(timeStr + tr(" timerId = %1").arg(t->timerId()));
break;
case 3:
plainTextEdit->appendPlainText(timeStr + tr(" timerId = %1").arg(t->timerId()));
break;
default:
plainTextEdit->appendPlainText(timeStr + tr(" timerId = %1").arg(t->timerId()));
break;
}
}
MainWindow::~MainWindow()
{
}
main.cpp代码
#include "MainWindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}