Qt中時鐘時間功能QTime詳解

斷無輕發表於2009-11-23

      QTime提供了時鐘時間功能,記錄從午夜開始的時、分、秒、毫秒數,並提供比較和操作時間的功能。下面結合原始碼介紹QTime類,為便於理解QTime的實現,下面程式碼均做適當的簡化。

      在QTime內部用一個int型私有變數mds來記錄時間資訊,即將時間轉換為毫秒數來儲存。QTime有兩個建構函式,預設的無參建構函式為QTime() : mds(NullTime){},將mds置為NullTime,以標誌為該物件在進一步設定時間前(setHMS())為空物件,而NullTime為QTime的一個私有列舉變數enum{NullTime = -1},所有QTime內部使用mds是否被置為-1來標誌物件是否為空物件,並且可以用isNull()函式可以檢查當前物件是否為空物件。而另一個引數建構函式為:

      QTime(int h, int m, int s, int ms){ setHMS(h, m, s, ms); }

      也就是進一步呼叫了時間的設定函式setHMS(),而所謂的時間設定函式其實很簡單,就是將引數時、分、秒、毫秒均轉換為毫秒錶示,對於一天來說,也就24個小時,所以以毫秒錶示,最大的數字也就是86400000。

      bool setHMS(int h, int m, int s, int ms){

         //檢查引數(略)

         mds = (h*SECS_PER_HOUR + M*SECS_PER_MIN + S)*1000 + ms;

         return true;

      }

      SECS_PER_HOUR-3600,SECS_PER_MIN-60,這兩個巨集應該很顯然。setHMS()必須接受合格的引數,否則不會定義得到有效的時間物件,可以用isValid()函式檢查該物件的有效性。作為私有變數mds,還有一個私有成員ds(),它的功能就是返回mds的值,但是它在返回前做了一個小小的判斷,即如果mds為空的話,它不返回-1(NullTime),而是返回0。

      當然,有了mds的毫秒形式記錄的時間,我們很容易換算出時、分、秒、毫秒各自的數值,也就是當我們顯式的呼叫hour(), minute(), second(), msec()時都由mds做了進一步的換算。既然統一都用毫秒數來表示,那所有的時間比較操作符就很容易理解了,純粹是兩個int型大小之間的比較。

      QTime有幾個靜態函式,currentTime()可以用當前時間來定義一個時鐘時間物件,fromString()可以根據一個字串定義一個時鐘時間物件。

      另外介紹一下start(), restart(), elapsed()方法:

      void QTime::start(){ *this = currentTime(); }      //呼叫start時即將該物件的時間更新為當前時間

      int QTime::restart()
      {
            QTime t = currentTime();
            int n = msecsTo(t);
            if (n < 0)                                //如果穿過午夜,即增加24小時86100000毫秒( passed midnight)
            n += 86400*1000;
           *this = t;
           return n;
      }

     int QTime::elapsed() const
     {
           int n = msecsTo(currentTime());
           if (n < 0)                                // passed midnight
                n += 86400 * 1000;
          return n;
     }

     elapsed()所做的事情就是返回自上次start()或者restart()之後已經有多少毫秒飄過去了,這裡進行了簡單的比較,如果現在的時間(毫秒形式)比以前的小,說明肯定穿過一個午夜了,那就加上一個24小時即86400*1000毫秒,那穿過兩個午夜怎辦,抱歉,只管一個午夜。而restart() 返回的和elapsed()返回的東西是一樣的,但還做了start()的事情,即更新該時間物件儲存的時間毫秒數,類似於常用電子錶上計時器的分圈計時效果。

     應該來說,QTime是一個很簡單的時鐘時間類,提供的方法也較為基礎,當然同時也很有效。

相關文章