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

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;
}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章