简介: 讲解QTimer 定时器(不可见控件)和 QDateTime日期时间的控件

[TOC]


本文初发于 “偕臧的小站“,同步转载于此。


简述:

详情: 见简介


编程环境: 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/xmuli/QtExamples【QtDateTimeEx】


开心分享:

因为有着许许多多的热心网友的无私分享,从他们的博客中学习成长,学会很多,故也不辞辛苦也将自己的项目或经验整理成博客的形式,也提供给一起大家学习探讨与交流