QT中定時器使用辦法(轉)


在Qt中使用定時器有兩種方法,一種是使用QObiect類的定時器;一種是使用QTimer類。
定時器的精確性依賴於操作系統和硬件,大多數平台支持20ms的精確度。

■、QObject類的定時器
QObject是所有Qt對象的基類,它提供了一個基本的定時器。通過QObject::startTimer(),可以把一個一毫秒為單位的時間間隔作 為參數來開始定時器,這個函數返回一個唯一的整數定時器的標識符。這個定時器開始就會在每一個時間間隔"觸發",直到明確的使用這個定時器的標識符來調用 QObject::killTimer()結束。
當定時器觸發時,應用程序會發送一個QTimerEvent。在事件循環中,處理器按照事件隊列的順序來處理定時器事件。當處理器正忙於其它事件處理時,定時器就不能立即處理。
QObject類還提供定時期的功能。與定時器相關的成員函數有:startTimer()、timeEvent()、killTimer()。

QObject基類中的startTimer()和timerEvent()原型及說明如下:

int QObject::startTimer(int interval);

開始一個定時器並返回定時器ID,如果不能開始一個定時器,將返回0。定時器開始后,每隔interval毫秒間隔將觸發一次超時事件,直到killTimer()被調用來刪除定時器。如果interval為0,那么定時器事件每次發生時沒有窗口系統事件處理。

virtual void QObject::timerEvent(QTimerEvent *event);

虛函數timerEvent()被重載來實現用戶的超時事件處理函數。如果有多個定時器在運行,QTimerEvent::timerId()被用來查找指定定時器,對其進行操作。
當定時器事件發生時,虛函數timerEvent()隨着QTimerEvent事件參數類一起被調用,重載這個函數可以獲得定時器事件。

定時器的用法如下:

//頭文件
class QNewObject : public QObject
{
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);
}

void QNewObject::timerEvent( QTimerEvent *event )
{
qDebug( "timer event, id %d", event->timerId() );
}

 

■、定時器類QTimer
定時器類QTimer提供當定時器觸發的時候發射一個信號的定時器,他提供只觸發一次的超時事件,通常的使用方法如下:

//創建定時器
QTimer *testTimer = new QTimer(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()) );

 

第二種介紹:

定時器的使用非常簡單,我們只需要以下幾個步驟就可以完成定時器的應用:
1.產生一個定時器
QTimer *time_clock=new QTimer(parent);
2.連接這個定時器的信號和槽,利用定時器的timeout()
connect(time_clock,SIGNAL(timeout()),this,SLOT(slottimedone()));
即定時時間到就會發送timeout()信號,從而觸發slottimedone()槽去完成某項事情
3.開始定時器,並設定定時周期
定時器定時有兩種:start(int time)和setSingleShot(true)
其中start(int time)是表示每隔time秒就會重啟定時器,可以重復觸發定時,除非你利用stop()將定時器關掉。
而setSingleShot(true)則是僅僅啟動定時器一次
我們工程中常用的是前者。
time_clock->start(2000);
備注:我在中文的官網上找到的關於定時器的用法是如下的使用格式:
QTimer *timer = new QTimer( myObject );
connect( timer, SIGNAL(timeout()), myObject, SLOT(timerDone()) );
timer->start( 2000, TRUE ); // 2秒單觸發定時器
關於最后一句,timer->start( 2000, TRUE );在我實際應用中,加上TRUE編譯器就會報錯,不知道為什么,去掉就沒有關系了。這個問題遺留下來,或許以后可以解決掉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM