C++ Qt開發:DateTime日期時間元件

2023-12-15 18:00:58

Qt 是一個跨平臺C++圖形介面開發庫,利用Qt可以快速開發跨平臺表單應用程式,在Qt中我們可以通過拖拽的方式將不同元件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹QDateTime日期與時間元件的常用方法及靈活運用。

在Qt中,日期和時間的處理通常使用 QDateTime 類。QDateTime 是一個用於表示日期和時間的類,而與之相關的元件還包括 QDateQTime以及QDateTime,以下是對這些元件的詳細概述。

QDate

QDate 類用於表示日期,包括年、月和日。

主要特點如下:

  • 建構函式: QDate(int year, int month, int day),用於建立一個 QDate 物件。
  • 獲取日期資訊: 提供了獲取年、月、日等日期資訊的方法,例如 year()month()day()
  • 比較日期: 可以進行日期的比較,判斷日期的先後順序。
  • 日期格式: 可以以不同的格式輸出日期的字串表示。

以下是 QDate 類的一些常用方法的說明和概述,以表格形式列出:

方法 描述
QDate() 預設建構函式,建立一個表示當前日期的 QDate 物件。
QDate(int year, int month, int day) 建構函式,建立一個指定年、月、日的 QDate 物件。
isValid() 檢查日期是否有效。
year() const 返回年份。
month() const 返回月份。
day() const 返回日期。
toString(const QString &format) const 返回日期的字串表示,可以通過指定格式進行格式化。
currentDate() 靜態函數,返回當前系統日期的 QDate 物件。
daysInMonth() 返回當前月份的天數。
daysInYear() 返回當前年份的天數。
addDays(int days) 返回增加指定天數後的 QDate 物件。
addMonths(int months) 返回增加指定月數後的 QDate 物件。
addYears(int years) 返回增加指定年數後的 QDate 物件。
operator+(int days) 過載加法運運算元,返回增加指定天數後的 QDate 物件。
operator-(int days) 過載減法運運算元,返回減去指定天數後的 QDate 物件。
daysTo(const QDate &date) const 返回到指定日期的天數差。
monthsTo(const QDate &date) const 返回到指定日期的月數差。
yearsTo(const QDate &date) const 返回到指定日期的年數差。
isValid() 檢查日期是否有效。

這些方法提供了對 QDate 進行構造、獲取、比較、格式化和運算等操作的靈活性。你可以根據應用的需求使用這些方法,方便地處理日期相關的操作。

QTime

QTime 類用於表示時間,包括小時、分鐘、秒和毫秒。

主要特點如下:

  • 建構函式: QTime(int h, int m, int s, int ms = 0),用於建立一個 QTime 物件。
  • 獲取時間資訊: 提供了獲取小時、分鐘、秒、毫秒等時間資訊的方法,例如 hour()minute()second()
  • 比較時間: 可以進行時間的比較,判斷時間的先後順序。
  • 時間格式: 可以以不同的格式輸出時間的字串表示。

以下是 QTime 類的一些常用方法的說明和概述,以表格形式列出:

方法 描述
QTime() 預設建構函式,建立一個表示當前時間的 QTime 物件。
QTime(int h, int m, int s, int ms = 0) 建構函式,建立一個指定小時、分鐘、秒和毫秒的 QTime 物件。
isValid() 檢查時間是否有效。
hour() const 返回小時部分。
minute() const 返回分鐘部分。
second() const 返回秒部分。
msec() const 返回毫秒部分。
toString(const QString &format) const 返回時間的字串表示,可以通過指定格式進行格式化。
currentTime() 靜態函數,返回當前系統時間的 QTime 物件。
addSecs(int secs) 返回增加指定秒數後的 QTime 物件。
addMSecs(int msecs) 返回增加指定毫秒數後的 QTime 物件。
operator+(int secs) 過載加法運運算元,返回增加指定秒數後的 QTime 物件。
operator-(int secs) 過載減法運運算元,返回減去指定秒數後的 QTime 物件。
secsTo(const QTime &t) const 返回到指定時間的秒數差。
msecsTo(const QTime &t) const 返回到指定時間的毫秒數差。
isValid() 檢查時間是否有效。

這些方法提供了對 QTime 進行構造、獲取、比較、格式化和運算等操作的靈活性。你可以根據應用的需求使用這些方法,方便地處理時間相關的操作。

QDateTime

QDateTime 類結合了日期和時間,用於表示日期和時間的組合。

主要特點如下:

  • 建構函式: QDateTime(QDate date, QTime time),用於建立一個 QDateTime 物件。
  • 獲取日期和時間資訊: 提供了獲取年、月、日、小時、分鐘、秒等資訊的方法。
  • 比較日期和時間: 可以進行 QDateTime 物件的比較,判斷日期和時間的先後順序。
  • 日期時間格式: 可以以不同的格式輸出日期和時間的字串表示。
  • 時區支援: QDateTime 提供了對時區的支援,可以進行時區的設定和獲取。

以下是 QDateTime 類的一些常用方法的說明和概述,以表格形式列出:

方法 描述
QDateTime() 預設建構函式,建立一個表示當前日期和時間的 QDateTime 物件。
QDateTime(const QDate &date, const QTime &time) 建構函式,建立一個由指定日期和時間組成的 QDateTime 物件。
isValid() 檢查日期和時間是否有效。
date() const 返回日期部分。
time() const 返回時間部分。
toString(const QString &format) const 返回日期和時間的字串表示,可以通過指定格式進行格式化。
currentDateTime() 靜態函數,返回當前系統日期和時間的 QDateTime 物件。
addDays(int days) 返回增加指定天數後的 QDateTime 物件。
addMonths(int months) 返回增加指定月數後的 QDateTime 物件。
addYears(int years) 返回增加指定年數後的 QDateTime 物件。
addSecs(int secs) 返回增加指定秒數後的 QDateTime 物件。
addMSecs(qint64 msecs) 返回增加指定毫秒數後的 QDateTime 物件。
operator+(int secs) 過載加法運運算元,返回增加指定秒數後的 QDateTime 物件。
operator-(int secs) 過載減法運運算元,返回減去指定秒數後的 QDateTime 物件。
operator-(const QDateTime &dateTime) 過載減法運運算元,返回兩個日期時間物件之間的時間差。
secsTo(const QDateTime &dateTime) const 返回到指定日期時間的秒數差。
msecsTo(const QDateTime &dateTime) const 返回到指定日期時間的毫秒數差。
daysTo(const QDateTime &dateTime) const 返回到指定日期時間的天數差。
monthsTo(const QDateTime &dateTime) const 返回到指定日期時間的月數差。
yearsTo(const QDateTime &dateTime) const 返回到指定日期時間的年數差。
toTime_t() 將日期時間物件轉換為自 1970-01-01 00:00:00 UTC 以來的秒數。
fromTime_t(uint seconds) 從自 1970-01-01 00:00:00 UTC 以來的秒數建立日期時間物件。

這些方法提供了對 QDateTime 進行構造、獲取、比較、格式化和運算等操作的靈活性。你可以根據應用的需求使用這些方法,方便地處理日期和時間相關的操作。

首先我們來繪製一個簡單的日期時間頁面,這裡需要注意頁面中的日期元件DateEditTimeEdit其長得很像之前文章中所提到的SpinBox但其兩者是不同的,讀者應注意區分兩者的不同指出,如下圖所示;

首先如何獲取日期時間,點選獲取日期按鈕時我們可以直接通過呼叫QDate::currentDate()則可獲取到當前日期,同理點選獲取時間按鈕則直接呼叫QTime::currentTime()實現,左側三個按鈕的功能實現如下所示;

#include <QDate>
#include <QTime>
#include <QDateTime>
#include <iostream>

// 設定日期元件
void MainWindow::on_pushButton_getdate_clicked()
{
    QDate curDate = QDate::currentDate();
    int year = curDate.year();
    int month = curDate.month();
    int day = curDate.day();

    ui->dateEdit->setDate(curDate);
    std::cout << year << "/" << month << "/" << day << std::endl;
}

// 設定時間元件
void MainWindow::on_pushButton_gettime_clicked()
{
    QTime curTime = QTime::currentTime();
    int hour = curTime.hour();
    int minute = curTime.minute();
    int second = curTime.second();

    ui->timeEdit->setTime(curTime);
    std::cout << hour << "/" << minute << "/" << second << std::endl;
}

// 設定日期時間
void MainWindow::on_pushButton_getdatetime_clicked()
{
    QDateTime curDateTime = QDateTime::currentDateTime();
    int yearDT = curDateTime.date().year();
    int monthDT = curDateTime.date().month();
    int dayDT = curDateTime.date().day();
    int hourDT = curDateTime.time().hour();
    int minuteDT = curDateTime.time().minute();
    int secondDT = curDateTime.time().second();

    ui->dateTimeEdit->setDateTime(curDateTime);

    std::cout << yearDT << "/" << monthDT << "/" << dayDT << std::endl;
    std::cout << hourDT << "/" << minuteDT << "/" << secondDT << std::endl;
}

接著我們來實現時間日期元件與字串之間的轉換,當我們需要將字串轉換為日期時可以通過QDateTime::fromString並根據字串規律對其進行格式化,同理通過使用curDateTime.toString即可實現日期時間轉換為字串。

// 將字串轉為日期
void MainWindow::on_pushButton_stod_clicked()
{
    // 獲取字串
    QString datestr = ui->lineEdit->text();

    datestr = datestr.trimmed();

    // 是否為空
    if(!datestr.isEmpty())
    {
        // 格式化
        QDateTime datetime = QDateTime::fromString(datestr,"yyyy-MM-dd hh:mm:ss");

        // 設定到日期元件上
        ui->dateTimeEdit_convert->setDateTime(datetime);
    }
}

// 將日期轉換為字串
void MainWindow::on_pushButton_dtos_clicked()
{
    QDateTime curDateTime = QDateTime::currentDateTime();
    ui->dateTimeEdit_convert->setDateTime(curDateTime);

    ui->lineEdit->setText(curDateTime.toString("yyyy-MM-dd hh:mm:ss"));
}

程式執行效果如下圖所示,讀者可通過點選不同的按鈕來實現不同的功能;

為了能更加充分的認識時間日期元件,此處我們將通過LCD Number元件實現一個簡單的鐘表,QLCDNumber 是 Qt 中用於顯示數位的小部件,通常用於顯示整數或浮點數值。它提供了一個類似於數位顯示器或儀表板的外觀,可以用於顯示各種數值資訊。

顯示器的使用非常容易,只需要setDigitCount()設定顯示長度,並通過setDecMode()設定為十進位制輸出模式,最後呼叫display()就可以將一個整數重新整理到螢幕上,完整程式碼如下所示;

#include <QTime>
#include <QTimer>

// 全域性定時器變數指標
QTimer *my_timer;

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 宣告定時器
    my_timer = new QTimer(this);
    // 繫結一個匿名函數
    connect(my_timer,&QTimer::timeout,[=]{

        // 獲取時間
        QTime curTime = QTime::currentTime();
        int hour = curTime.hour();
        int minute = curTime.minute();
        int second = curTime.second();

        // 設定LCD螢幕2位顯示
        ui->lcdNumber_hour->setDigitCount(2);
        ui->lcdNumber_minute->setDigitCount(2);
        ui->lcdNumber_hour->setDigitCount(2);

        // 使用十進位制
        ui->lcdNumber_hour->setDecMode();
        ui->lcdNumber_minute->setDecMode();
        ui->lcdNumber_second->setDecMode();

        // 重新整理引數
        ui->lcdNumber_hour->display(hour);
        ui->lcdNumber_minute->display(minute);
        ui->lcdNumber_second->display(second);
    });

    // 啟動定時器1000毫秒執行依次
    my_timer->start(1000);
}

MainWindow::~MainWindow()
{
    delete ui;
}

讀者可自行編譯執行這段程式,則會看到每隔一秒計時器都會向前遞增以為,如下圖所示;