1.QObject類的定時器
QObject是所有Qt對象的基類,它提供了一個基本的定時器。通過QObject::startTimer(),可以把一個一毫秒為機關的時間間隔作為參數來開始定時器,這個函數傳回一個唯一的整數定時器的辨別符。這個定時器開始就會在每一個時間間隔"觸發",直到明确的使用這個定時器的辨別符來調用QObject::killTimer()結束。
當定時器觸發時,應用程式會發送一個QTimerEvent。在事件循環中,處理器按照事件隊列的順序來處理定時器事件。當處理器正忙于其它事件處理時,定時器就不能立即處理。
QObject類還提供定時期的功能。與定時器相關的成員函數有:startTimer()、timeEvent()、killTimer()。QObject基類中的startTimer()和timerEvent()原型及說明如下:
intQObject::startTimer(int interval);
開始一個定時器并傳回定時器ID,如果不能開始一個定時器,将傳回0。定時器開始後,每隔interval毫秒間隔将觸發一次逾時事件,直到killTimer()被調用來删除定時器。如果interval為0,那麼定時器事件每次發生時沒有視窗系統事件處理。
virtual voidQObject::timerEvent(QTimerEvent *event);
虛函數timerEvent()被重載來實作使用者的逾時事件處理函數。如果有多個定時器在運作,QTimerEvent::timerId()被用來查找指定定時器,對其進行操作。
當定時器事件發生時,虛函數timerEvent()随着QTimerEvent事件參數類一起被調用,重載這個函數可以獲得定時器事件。
定時器的用法如下:
//頭檔案
class QNewObject : publicQObject
{
Q_OBJECT
public:
QNewObject( QObject * parent = 0 );
virtual ~QNewObject();
protected:
void timerEvent( QTimerEvent *event );
int m_nTimerId;
};
//源檔案
QNewObject::QNewObject(QObject * parent )
:QNewObject( parent )
m_nTimerId = startTimer(1000);
}
QNewObject::~QNewObject()
if ( m_nTimerId != 0 )
killTimer(m_nTimerId);
voidQNewObject::timerEvent( QTimerEvent *event )
qDebug( "timer event, id %d",event->timerId() );
2.定時器類QTimer
定時器類QTimer提供當定時器觸發的時候發射一個信号的定時器,他提供隻觸發一次的逾時事件,通常的使用方法如下:
//建立定時器
QTimer *testTimer = newQTimer(this);
//将定時器逾時信号與槽(功能函數)聯系起來
connect( testTimer,SIGNAL(timeout()), this, SLOT(testFunction()) );
//開始運作定時器,定時時間間隔為1000ms
testTimer->start(1000);
...
//停止運作定時器
if (testTimer->isActive() )
testTimer->stop();
QTimer還提供了一個簡單的隻有一次定時的函數singleShot()。 一個定時器在100ms後觸發處理函數animateTimeout()并且隻觸發一次。代碼如下:
QTimer::singleShot( 100,this, SLOT(animateTimeout()) );
QTimer類提供了定時器信号和單觸發定時器。
它在内部使用定時器事件來提供更通用的定時器。QTimer很容易使用:建立一個QTimer,使用start()來開始并且把它的timeout()連接配接到适當的槽。當這段時間過去了,它将會發射timeout()信号。
注意當QTimer的父對象被銷毀時,它也會被自動銷毀。
執行個體:
QTimer *timer = new QTimer( myObject );
connect( timer, SIGNAL(timeout()),myObject, SLOT(timerDone()) );
timer->start( 2000, TRUE ); // 2秒單觸發定時器
你也可以使用靜态的singleShot()函數來建立單觸發定時器。
作為一個特殊情況,一旦視窗系統事件隊列中的所有事件都已經被處理完,一個定時為0的QTimer就會到時間了。
這也可以用來當提供迅速的使用者界面時來做比較繁重的工作。
QTimer *t = new QTimer( myObject );
connect( t, SIGNAL(timeout()), SLOT(processOneThing()));
t->start( 0, FALSE );
myObject->processOneThing()将會被重複調用并且應該很快傳回(通常在處理一個資料項之後),這樣Qt可以把事件傳送給視窗部件并且一旦它完成這個工作就停止這個定時器。這是在圖形使用者界面應用程式中實作繁重的工作的一個典型方法,現在多線程可以在越來越多的平台上使用,并且我們希望無效事件最終被線程替代。
注意QTimer的精确度依賴于底下的作業系統和硬體。絕大多數平台支援20毫秒的精确度,一些平台可以提供更高的。如果Qt不能傳送定時器觸發所要求的數量,它将會默默地抛棄一些。
另一個使用QTimer的方法是為你的對象調用QObject::startTimer()和在你的類中(當然必須繼承QObject)重新實作QObject::timerEvent()事件處理器。缺點是timerEvent()不支援像單觸發定時器或信号那樣的進階水準。
一些作業系統限制可能用到的定時器的數量,Qt會盡力在限制範圍内工作。
本文轉自莫水千流部落格園部落格,原文連結:http://www.cnblogs.com/zhoug2020/p/6423584.html,如需轉載請自行聯系原作者