Qt有两种定时器,一种是QObject类,另一种是QTimer类。
(1)QObject类提供了一个基本的定时器,通过函数startTimer()来启动,通过killTimer()来结束,通过QTimerEvent来处理定时器事件
startTimer(int interval)启动一个时间间隔为interval毫秒的定时器,返回一个定时器标识符,如果未能启动成功,则返回0。
该定时器只能使用killTime()来杀死,killTimer(int id)通过定时器标识符来杀死定时器。如果有多个定时器,可以通过QTimerEvent::timerId()来获取已经启动的定时器标识符。
(2)QTimer类定时器是QObject类定时器的扩展,它可以提供更多的功能。比如,它支持单次触发和多次触发。
使用QTimer类定时器的步骤:
bool isActive() const 获得定时器激活状态
bool isSingleShot() const 获得单次触发使能状态
int remainingTime() const 获得距离触发定时器事件的剩余时间
void setInterval(int msec) 设置定时器时间间隔
void setSingleShot(bool singleShot) 设置使能/禁用单次触发
void setTimerType(Qt::TimerType atype) 设置定时器类型
int timerId() const 获得定时器标识符
Qt::TimerType timerType() const 获得定时器类型
void start() 启动定时器
void stop() 暂停定时器
定时器事件和普通鼠标、键盘事件一样进入事件循环处理。因此,定时器的处理函数需要尽快完成,不然也会把界面卡死。
定时器不是精确的,因为它的处理函数也是放在事件循环中执行的;
头文件:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimerEvent>
#include <QTime>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
void timerEvent(QTimerEvent *event);
private:
int m_timerId;
};
#endif // MAINWINDOW_H
源文件:
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_timerId = startTimer(1000);
}
MainWindow::~MainWindow()
{
delete ui;
}
//定时器处理函数
void MainWindow::timerEvent(QTimerEvent *event)
{
//可以有多个定时器,每个定时器有不同的处理
if(event->timerId() == m_timerId)
{
QTime now = QTime::currentTime();
QString text = now.toString("HH:mm:ss");//按照24小时制的格式进行字符串格式化;
ui->timeLineEdit->setText(text);
}
}
时间格式化说明:
hh:mm:ss
按照12小时制的格式进行字符串格式化
如果时间处于00:00:00——12:59:59,则返回的字符串正常
如果时间处于13:00:00——23:59:59,则返回的字符串是实际时间-12小时后的值,也就是说比真实的时间少了12个小时。
例如:14:00:00进行格式化后的字符串为“2:00:00”
HH:mm:ss
按照24小时制的格式进行字符串格式化
当时间为任意一个区间,则返回的字符串都是正常的。
设计界面: