QTimer 與 QLCDNumber


Qt中的QTimer會定時發出QTimerEvent事件,您可以設定一個接受QTimerEvent的函式來接收這個事件,一旦接收到QTimerEvent事件,函式的內容就會被執行,例如接下來的範例,將設計一個數位時鐘,可以顯示目前時間與日期。

數位時鐘的顯示將使用QLCDNumber,這邊直接繼承QLCDNumber來實作:
  • DigitalClock.h
#ifndef DIGITALCLOCK_H
#define DIGITALCLOCK_H

#include <QLCDNumber>

class DigitalClock : public QLCDNumber {

public:
DigitalClock(QWidget *parent=0);

protected:
void timerEvent(QTimerEvent *);

private:
bool isColon;
};

#endif

在DigitalClock中,重新定義了timerEvent()來接受TimerEvent,以定時接受QTimer的事件並進行時間的擷取與顯示更新,DigitalClock實作如下:
  • DigitalClock.cpp
#include "DigitalClock.h"

#include <QDateTime>

DigitalClock::DigitalClock(QWidget *parent) : QLCDNumber(parent) {
this->isColon = false;
this->setFrameStyle(QFrame::Panel | QFrame::Raised);
this->setNumDigits(11);
QObject::startTimer(500);
}

void DigitalClock::timerEvent(QTimerEvent *e) {
isColon = !isColon;

QString timeString = QTime::currentTime().toString().left(5);

QDate date = QDate::currentDate();
QString dateString;
dateString.sprintf( " %2d-%2d", date.month(), date.day());

QString displayString = timeString + dateString;

if (!isColon) {
displayString[2] = ' ';
}

display(displayString);
}

QTimer的啟動是使用QObject::startTimer(500),
如果想停止QTimer,則使用QTimer::killTimer(),500的單位是毫秒,這邊每0.5秒發出一次事件,每次timerEvent()接受到QTimerEvent事件時,會擷取目前的時間與日期,每0.5秒處理一次是為了處理冒號的顯示,這是由timerEvent()中if判斷式來負責。

撰寫一個主程式來看看這個元件是否運作正常:
  • main.cpp
#include "DigitalClock.h"
#include <QApplication>

int main(int argc, char *argv[]) {
QApplication app(argc, argv);

DigitalClock *digitalClock = new DigitalClock;

digitalClock->resize(500, 80);
digitalClock->setWindowTitle("QTimer");

digitalClock->show();

return app.exec();
}

執行的結果畫面如下所示: