From Gossip@caterpillar

Qt3 Gossip: 使用 QTimer 製作數位時鐘

這個範例改寫自Qt的線上範例,利用Timer定時發出QTimerEvent事件,以製作一個LCD數位時鐘。

首先編輯dclock.h定義檔:
  • dclock.h
#ifndef DCLOCK_H
#define DCLOCK_H

#include <qlcdnumber.h>

class DigitalClock : public QLCDNumber {
Q_OBJECT
public:
DigitalClock(QWidget *parent=0, const char *name=0);

protected:
void timerEvent(QTimerEvent *);

private slots:
void showTime();

private:
bool showingColon;
};

#endif

再來是編輯dclock.cpp實作定義檔的內容:
  • dclock.cpp
#include "dclock.h"
#include <qdatetime.h>

DigitalClock::DigitalClock(QWidget *parent, const char *name)
: QLCDNumber(parent, name) {
showingColon = FALSE;
setFrameStyle(QFrame::Panel | QFrame::Raised);
setLineWidth(2);
showTime();
QObject::startTimer(500);
}

void DigitalClock::timerEvent(QTimerEvent *e) {
showTime();
}

void DigitalClock::showTime() {
showingColon = !showingColon;
QString s = QTime::currentTime().toString().left(5);
if (!showingColon)
s[2] = ' ';
if (s[0] == '0')
s[0] = ' ';
display(s);
}

最後是主程式main.cpp:
  • main.cpp
#include "dclock.h"
#include <qapplication.h>

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

DigitalClock *clock = new DigitalClock;

clock->resize(170, 80);
clock->setCaption("Digital Clock");

app.setMainWidget(clock);

clock->show();

return app.exec();
}

接下來我們逐一說明這個程式中新遇到的類別、函式與主要的邏輯。Qt中的QTimer會定時發出QTimerEvent事件,我們設定了timerEvent(QTimerEvent *)來接收這個事件,一旦接收到QTimerEvent事件,timerEvent()的內容就會被執行:
protected:
    void timerEvent(QTimerEvent *);

private slots:
    void showTime();

private:
    bool showingColon;


showTime()是個自訂的Slot,我們將在這個函式中實作顯示時間的程式,showingColon用來表示是否顯示數位時鐘的秒數冒號:
DigitalClock::DigitalClock(QWidget *parent, const char *name)
    : QLCDNumber(parent, name) {
    showingColon = FALSE;
    setFrameStyle(QFrame::Panel | QFrame::Raised);
    setLineWidth(2);
    showTime();
    QObject::startTimer(500);
}

實作DigitalClock類別的建構函式,用來初始一些變數、視窗樣式與啟動QTimer等,setFrameStyle ()設定了QLCDNumber的外框樣式,並使用setLineWidth()設定外框為2個像素寬,QObject::startTimer (500)表示啟動QTimer,並設定每500毫秒(0.5秒)發出QTimerEvent事件,在建構函式中,我們也使用showTime()初次取 得系統時間。

當接收到QTimerEvent時,這個函式就會被執行,而它目前只有一個陳述句,就是呼叫showTime():
void DigitalClock::timerEvent(QTimerEvent *e) {
    showTime();
}


QTimer::currentTime()會取得系統時間,我們使用toString()將之轉換為QString字串,並使用left (5)取字串中的左邊5個字元;showingColon只有兩種狀態,TRUE或FALSE,如果為TRUE,就顯示冒號,否則就將字串中冒號的位置設 為空白,如此就會有一閃一閃的效果:
void DigitalClock::showTime() {
    showingColon = !showingColon;
    QString s = QTime::currentTime().toString().left(5);
    if (!showingColon)
        s[2] = ' ';
    if (s[0] == '0')
        s[0] = ' ';
    display(s);
}

程式的執行結果就如下圖所示: