QTimerEvent用來描述一個定時器事件。隊醫一個QObject的子類,只需要使用Int QObject::startTimer(int interval)函數就可以開啓一個定時器。輸入參數是毫秒爲單位的整數,表明設定的時間。返回值爲一個整型值,代表這個定時器的編號。當定時器溢出(即定時時間達到時)可以在timerEvent函數中進行需要的操作。
Qt中使用qrand和qsrand兩個函數實現隨機數。
新建Qt Widgets項目mytimerevent繼承自QtWidget,類名默認Widget。
widget.h中添加函數聲明如下
protected:
void timerEvent(QTimerEvent *event);
添加三個私有成員變量如下
int id1,id2,id3;
然後在widget.cpp的構造函數中,起3個定時器,定時時間分別爲1秒,1.5秒,2秒,代碼如下。
id1=startTimer(1000);
id2=startTimer(1500);
id3=startTimer(2000);
定時器事件處理函數實現如下
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId()==id1)//判斷是哪個定時器
{
qDebug()<<"timer 1";
}
else if(event->timerId()==id2)
{
qDebug()<<"timer 2";
}
else if(event->timerId()==id3)
{
qDebug()<<"timer 3";
}
}
運行效果打印如下信息
前面是實現QObject中的startTimer函數,其實編程中更多使用的是QTimer類實現一個定時器。它提供了更高層次的編程接口。下面使用 QTimer實現一個簡單電子錶功能。
上面工程中繼續添加內容,在設計模式中添加LCD Number部件。
widget.h中添加私有槽聲明如下。
private slots:
void timerUpdate();
在widget.cpp中包含頭文件
#include <QTimer>
#include <QTime>
在構造函數中啓動定時器並將定時器溢出信號關聯到槽上,代碼如下
QTimer* timer=new QTimer(this);//創建定時器
connect(timer,&QTimer::timeout,this,&Widget::timerUpdate);//關聯定時器的溢出信號到槽上
timer->start(1000);//設置溢出時間爲1秒,並啓動定時器
實現定時器溢出信號槽函數代碼如下
void Widget::timerUpdate()
{
QTime time=QTime::currentTime();//獲取當前時間
QString text=time.toString("hh:mm");//轉換爲字符串
if((time.second()%2)==0)
text[2]=' ';//每隔一秒將":"顯示爲空格
ui->lcdNumber->display(text);
}
使用QTime::currentTime獲取當前時間,使用QTime的second()函數來獲取秒的值,並與2取餘,爲0就將‘:’顯示爲空格,實現一秒閃爍一下的效果。
最後運行效果如下
使用隨機數函數來讓LCD部件每隔一秒移動一個隨機位置。
在構造函數中添加
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
這裏的意思是以從0點到當前時間的秒數,作爲qsrand的參數,即作爲隨機數的初始值。如果不設置初值,每次運行程序會產生相同的一組隨機數。
在timerUpdate函數裏添加以下代碼
int rand=qrand()%300;//產生300以內的整隨機數
ui->lcdNumber->move(rand,rand);
最後說一下使用QTimer::singleShot函數開啓一個只運行一次的定時器。