簡介: 講解QTimer
定時器(不可見控件)和 QDateTime
日期時間的控件
文章目錄
本博文的簡述or解決問題?
詳情: 見簡介
編程環境: win10 x64 專業版 1803
編程軟件: visual studio 2015
, Qt Creator 4.8.2 (Enterprise)
, Qt 5.9.8
同步博文:
- 本篇的csdn/github.io同步博文: QTimer和QDateTime的講解和使用
運行效果:
先上一個最終的運行效果圖:
時間日期相關的類:
時間日期是經常遇到的數據類型,Qt中時間日期類型的類如下。
- QTime:時間數據類型,僅表示時間,如15:23:13。
- QDate:日期數據類型,僅表示日期,如2017-4-5。
- QDateTime:日期時間數據類型,表示日期和時間,如2017-03-2308:12:43。
Qt中有專門用於日期、時間編輯和顯示的界面組件,介紹如下。
- QTimeEdit:編輯和顯示時間的組件。
- QDateEdit:編輯和顯示日期的組件。
- QDateTimeEdit:編輯和顯示日期時間的組件。
- OCalendarWidget:一個用日曆形式選擇日期的組件。
QDateTimeEdit時間屬性:
屬性 | 含義 |
---|---|
datetime | 日期時間 |
date | 日期 |
time | 時間 |
maximumDate Time、minimumDate Time | 最大、最小日期 |
maximumDate、minimumDate | 最大、最小時間 |
currentSection | 當前輸入光標所在的時間日期數據段,是枚舉類型QDateTimeEdit::Section |
QDateTimeEdit | 顯示日期時間數據時分爲多個段,單擊編輯框右側的上下按鈕可修改當前段的值 |
currentSectionIndex | 用序號表示的輸入光標所在的段 |
calendarPopup | 是否允許彈出一個日曆選擇框 |
displayFormat | 顯示格式,日期時間數據的顯示格式 |
date和time設置其中一個,就會自動修改其中另外一個。
QDateTimeEdit:如輸入光標在YearSection段,就修改“年”的值。
calendarPopup:當取值爲true時,右側的輸入按鈕變成與QComboBox類似的下拉按鈕,單擊按鈕時出現一個日曆選擇框,用於在日曆上選擇日期。對於QTimeEdit,此屬性無效。
displayFormat:例如設置爲“yyyy-MM-dd HH:mm:ss”,一個日期時間數據就顯示爲“2016-11-0208:23:46”
QTimer屬性:
定時器是用來處理週期性事件的一種對象,類似於硬件定時器。例如設置一個定時器的定時。週期爲1000毫秒,那麼每1000毫秒就會發射定時器的timeout)信號,在信號關聯的槽函數裏就,可以做相應的處理。Qt中的定時器類是QTimer,它直接從QObject類繼承而來,不是界面組件類。
QTimer* m_timer; //定時器(不可見控件)
QTime m_time; //計時器(此處用作)
DateTime轉QString:
//獲取當前時間
QDateTime currDateTime = QDateTime::currentDateTime();
//QString轉爲DateTime
ui->editDateTime->setText(currDateTime.toString("yyyy-MM-dd hh:mm:ss:zzz"));
//DateTime轉爲QString
ui->labCurrDataTime->setText(currDateTime.toString("yyyy-MM-dd hh:mm:ss:zzz"));
常用日期顯示格式:
核心源碼:
//editDate控件在UI設計師裏面,選中了calendarPopup (日曆彈出的屬性)和displayFormat顯示格式
m_timer = new QTimer(this);
m_timer->stop(); //關閉定時器
m_timer->setInterval(1000); //設定定時週期, 單位 毫秒
connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimerOut()));
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//獲取當前日期和時間,該日期時間欄裏面顯示
void ExDateTime::on_btnGetDateTime_clicked()
{
QDateTime currDateTime = QDateTime::currentDateTime();
ui->timeEdit->setTime(currDateTime.time());
ui->editTime->setText(currDateTime.toString("hh:mm:ss:zzz"));
ui->dateEdit->setDate(currDateTime.date());
ui->editDate->setText(currDateTime.toString("yyyy-MM-dd"));
ui->dateTimeEdit->setDateTime(currDateTime);
ui->editDateTime->setText(currDateTime.toString("yyyy-MM-dd hh:mm:ss:zzz"));
ui->labCurrDataTime->setText(currDateTime.toString("yyyy-MM-dd hh:mm:ss:zzz"));
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//計時器開始
void ExDateTime::on_btnStatrt_clicked()
{
m_time.start(); //計時器開始
m_timer->start(); //定時器開始
ui->btnStatrt->setEnabled(false); //開始按下之後,開始按鈕禁用
ui->btnStop->setEnabled(true); //同時結束按鈕可用
ui->btnPeriod->setEnabled(false); //設定週期的按鈕爲禁用
ui->labGo->setText(QString("時間流逝在後臺計算中..."));
}
//計時器結束
void ExDateTime::on_btnStop_clicked()
{
m_timer->stop(); //定時器停止
ui->btnStop->setEnabled(false); //結束按下之後,結束按鈕禁用
ui->btnStatrt->setEnabled(true); //同時開始按鈕可用
int tmMsec = m_time.elapsed(); //計時器Time沒有對應的stop(), elapsed獲取它的毫秒數
int ms = tmMsec % 1000; //經過的毫秒
int sec = tmMsec / 1000; //經過的秒
ui->btnPeriod->setEnabled(true); //設定週期的按鈕爲可用
ui->labGo->setText(QString("時間已經流逝:%1 秒 %2 毫秒").arg(sec).arg(ms));
}
//處理定時器的槽函數
void ExDateTime::onTimerOut()
{
QTime currTime = QTime::currentTime();
ui->lcdHH->display(currTime.hour()); //多種顯示時間方法
ui->lcdmm->display(currTime.toString("mm"));
ui->lcdSS->display(currTime.toString("ss"));
int val = ui->progressBar->value(); //設置進度條同時增加
val++;
if (val > 100)
val = 0;
ui->progressBar->setValue(val);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//選擇日曆時間
void ExDateTime::on_calendarWidget_selectionChanged()
{
QDate date =ui->calendarWidget->selectedDate();
ui->editChoose->setText(date.toString("yyyy年MM月dd日"));
}
//設定定時器QTimer週期
void ExDateTime::on_btnPeriod_clicked()
{
m_timer->setInterval(ui->spinBox->value());
}
源碼下載:
https://github.com/touwoyimuli/QtExamples 【QtDateTimeEx】
開心分享:
因爲有着許許多多的熱心網友的無私分享,從他們的博客中學習成長,學會很多,故也不辭辛苦也將自己的項目或經驗整理成博客的形式,也提供給一起大家學習探討與交流