Qt 是一個跨平臺C++圖形介面開發庫,利用Qt可以快速開發跨平臺表單應用程式,在Qt中我們可以通過拖拽的方式將不同元件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹QDateTime
日期與時間元件的常用方法及靈活運用。
在Qt中,日期和時間的處理通常使用 QDateTime
類。QDateTime
是一個用於表示日期和時間的類,而與之相關的元件還包括 QDate
、 QTime
以及QDateTime
,以下是對這些元件的詳細概述。
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(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(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
進行構造、獲取、比較、格式化和運算等操作的靈活性。你可以根據應用的需求使用這些方法,方便地處理日期和時間相關的操作。
首先我們來繪製一個簡單的日期時間頁面,這裡需要注意頁面中的日期元件DateEdit
和TimeEdit
其長得很像之前文章中所提到的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;
}
讀者可自行編譯執行這段程式,則會看到每隔一秒計時器都會向前遞增以為,如下圖所示;