本例用來展示 QTimer 的使用,如何定時的更新一個窗口部件。
1 QLCDNumber 類
QLCDNumber 是一種可將數字顯示為類似 LCD 形式的窗口部件,它同 QLabel 一樣,都繼承自 QFrame,而 QFrame 繼承自 QWidget
頭文件 digitalclock.h
1 #include <QLCDNumber> 2 3 class DigitalClock : public QLCDNumber 4 { 5 Q_OBJECT 6 7 public: 8 DigitalClock(QWidget *parent = 0); 9 ~DigitalClock(); 10 11 private slots: 12 void showTime(); 13 };
DigitalClock 繼承自 QLCDNumber 類,對於需要信號和槽的類,#5 處的 Q_OBJECT 宏是必需的,#8 聲明構造函數,#9 聲明析構函數,#11~12 聲明槽函數 showTime(),其中構造函數的實現如下:
1 DigitalClock::DigitalClock(QWidget *parent) 2 : QLCDNumber(parent) 3 { 4 setSegmentStyle(QLCDNumber::Filled); 5 6 showTime(); 7 8 setWindowTitle(tr("Digital Clock")); 9 resize(150, 60); 10 }
析構函數內容為空,槽函數 showTime() 中, #3 獲取到當前時間後,#4 將其轉換為 “hh:mm” 格式,#5 顯示出時間。
1 void DigitalClock::showTime() 2 { 3 QTime time = QTime::currentTime(); 4 QString text = time.toString("hh:mm"); 5 display(text); 6 }
此時,程序可以顯示數字時鐘,但不是實時,只在第一次運行時獲取當前的時間並顯示出來。為了實時顯示,則需要下面的 QTimer 類。
2 QTimer 類
QTimer 類繼承自 QObject,可用來實時的更新時間。構造函數如下:#6 新建一個定時器,#7 利用 connect() 函數,連接信號 timeout() 和 槽函數 showTime(),#8 開啟定時器,並設置時間間隔為 1000 ms
1 DigitalClock::DigitalClock(QWidget *parent) 2 : QLCDNumber(parent) 3 { 4 setSegmentStyle(QLCDNumber::Filled); 5 6 QTimer *timer = new QTimer(this); 7 connect(timer, SIGNAL(timeout()), this, SLOT(showTime())); 8 timer->start(1000); 9 10 showTime(); 11 12 setWindowTitle(tr("Digital Clock")); 13 resize(150, 60); 14 }
最終的 showTime() 如下: #5 和 #6 通過取余運算,使得時鐘和分鐘之間的分號,每隔一秒就消失,從而實現閃爍功能
1 void DigitalClock::showTime() 2 { 3 QTime time = QTime::currentTime(); 4 QString text = time.toString("hh:mm"); 5 if((time.second() % 2) == 0) 6 text[2] = ' '; 7 display(text); 8 }
界面如下:
參考資料:
Qt 助手,Qt 5.7 | Qt Widgets | Digital Clock Example