QTimer和QDateTime的講解和使用

簡介: 講解QTimer 定時器(不可見控件)和 QDateTime日期時間的控件

本博文的簡述or解決問題?

詳情: 見簡介


編程環境: win10 x64 專業版 1803

編程軟件: visual studio 2015Qt Creator 4.8.2 (Enterprise)Qt 5.9.8


同步博文:


運行效果:

先上一個最終的運行效果圖:


時間日期相關的類:

時間日期是經常遇到的數據類型,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 顯示格式,日期時間數據的顯示格式

datetime設置其中一個,就會自動修改其中另外一個。

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】


開心分享:

因爲有着許許多多的熱心網友的無私分享,從他們的博客中學習成長,學會很多,故也不辭辛苦也將自己的項目或經驗整理成博客的形式,也提供給一起大家學習探討與交流

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