当前位置: 首页 > news >正文

【QT】时间日期与定时器

目录

1.时间日期相关的类

2.日期时间数据与字符串之间的转换

2.1 时间、日期编辑器属性设置

2.2 日期时间数据的获取与转换为字符串

2.3 字符串转换为日期时间

3.QCaIendarWidget日历组件

3.1基本属性

3.2 公共函数

3.3 信号

4.实例程序演示时间日期与定时器的使用

1.时间日期相关的类

时间日期是经常遇到的数据类型,Qt中时间日期类型的类如下。
  • QTime:时间数据类型,仅表示时间,如巧:23:13。
  • QDate:日期数据类型,仅表示日期,如2017一4巧。
  • QDateTime:日期时间数据类型,表示日期和时间,如2017.03一2308:12:43。
Qt中有专门用于日期、时间编辑和显示的界面组件,介绍如下。
  • QTimeEdit:编辑和显示时间的组件。
  • QDateEdit:编辑和显示日期的组件。
  • QDateTimeEdit:编辑和显示日期时间的组件。
  • QCaIendarWidget:一个用日历形式选择日期的组件。
定时器类是QTimer:
定时器是用来处理周期性事件的一种对象,类似于硬件定时器。例如设置一个定时器的定时
周期为1000亳秒,那么每1000毫秒就会发射定时器的timeout()信号,在信号关联的槽函数里就
可以做相应的处理。Qt中的定时器类是QTimer,它直接从QObject类继承而来,不是界面组件类。

2.日期时间数据与字符串之间的转换

2.1 时间、日期编辑器属性设置

QDateEdit和QTimeEdit都从QDateTimeEdit继承而来,实现针对日期或时间的特定显示功
能。实际上,QDateEdit和QTimeEdit的显示功能都可以通过QDateTimeEdit实现,只需设置好
属性即可。
QDateTimeEdit类的主要属性的介绍如下。
  • datetime:日期时间。
  • date:日期,设置datetime时会自动改变date,同样,设置date时,也会自动改变datetime
  • 里的日期。
  • time:时间,设置datetime时会自动改变time,同样,设置time时,也会自动改变datetime
  • 里的时间。
  • maximumDateTime、minimumDateTime:最大、最小日期时间。
  • maximumDate、minimumDate:」最丿(、最刁、日其月。
  • maximumTime、minimumTime:最大、最小时间。
  • currentsection:当前输入光标所在的时间日期数据段,是枚举类型QDateTimeEdit::Section。
QDateTimeEdit显示日期时间数据时分为多个段,单击编辑框右侧的上下按钮可修改当前段的               值。如输入光标在Yearsection段,就修改“年”的值。
  • currentsectionlndex:用序号表示的输入光标所在的段。
  • calendarPopup:是否允许弹出一个日历选择框。当取值为true时,右侧的输入按钮变成与
  • QComboBox类似的下拉按钮,单击按钮时出现一个日历选择框,用于在日历上选择日期。对于QTimeEdit,此属性无效。
  • displayFormat:显示格式,日期时间数据的显示格式,例如设置为“yyyy-MM-dd HH:mm:ss”,一个日期时间数据就显示为“2016-11-02 08:23:46”。

2.2 日期时间数据的获取与转换为字符串

void Dialog::on_btnGetTime_clicked()
{//获取当前日期时间,为三个专用编辑器设置日期时间数据,并转换为字符串QDateTime curDateTime=QDateTime::currentDateTime(); //读取当前日期时间ui->timeEdit->setTime(curDateTime.time()); //设置时间ui->editTime->setText(curDateTime.toString("hh:mm:ss"));//转换为字符串显示ui->dateEdit->setDate(curDateTime.date());//设置日期ui->editDate->setText(curDateTime.toString("yyyy-MM-dd"));//转换为字符串显示ui->dateTimeEdit->setDateTime(curDateTime);//设置日期时间ui->editDateTime->setText(curDateTime.toString("yyyy-MM-dd hh:mm:ss"));//转换为字符串显示
}
QDateTIME::toString()函数的函数原型是:
QString QDateTime::toString(const QString &format) const
它将日期时间数据按照format指定的格式转换为字符串。format是一个字符串,包含一些特
定的字符,表示日期或时间的各个部分,表4-2是用于日期时间显示的常用格式符。
在设置日期时间显示字符串格式时,还可以使用填字符,甚至使用汉字。例如,日期显示格
式可以设置为:curDateTime.toString("yyyy年MM月dd日");这样得到的字符串是“2016年11月21日”。

2.3 字符串转换为日期时间

同样的,也可以将字符串转换为QTime、QDate或QDateTime类型,使用静态函数QDateTime::fromString(),其函数原型为:
QDateTime  QDateTime::fromString(const QString &string,const QString &format)
其中,第1个参数string是日期时间字符串形式,第2个参数format是字符串表示的格式,
按照表4-2的格式字符定义。
void Dialog::on_btnSetDateTime_clicked()
{//字符串转换为 QDateTimeQString str=ui->editDateTime->text();//读取字符串表示的日期str=str.trimmed();//去掉空格if (!str.isEmpty()){//这里将字符串str按照格式"yyyy-MM-ddhh:mm:ss"转换为日期时间变量,格式是指字符串str所表示的日期时间的格式。QDateTime datetime=QDateTime::fromString(str,"yyyy-MM-dd hh:mm:ss"); //从字符串转换为 QDateTimeui->dateTimeEdit->setDateTime(datetime);//设置日期时间}
}

3.QCaIendarWidget日历组件

QCalendarWidget一次显示一个日历月,并允许用户选择一个日期。

QCalendarWidget有一个信号selectionChanged(),在日历上选择的日期变化后会发射此信号,

为此信号创建槽函数,编写代码如下:

void Dialog::on_calendarWidget_selectionChanged()
{ //在日历上选择日期QDate dt=ui->calendarWidget->selectedDate(); //读取选择的日期时间QString str=dt.toString("yyyy年M月d日");//转换为字符串ui->editCalendar->setText(str); //字符串显示日期
}

3.1基本属性

1、dateEditEnabled
该属性表示是否使用一个弹出框来选择当前选中时间,按下非修饰键(空格、字母等)会弹出一个日期编辑框,如果按下的是数字,弹窗并认为按下的数字为输入,弹窗的小部件类似于QDateEdit,修改之后会在一定的延迟dateEditAcceptDelay之后生效。
bool isDateEditEnabled() const
void setDateEditEnabled(bool enable)
2、dateEditAcceptDelay
该属性表示,在dateEditEnabled为true的情况下,弹窗小部件编辑结束之后延迟多久生效,参数为毫秒ms。
int dateEditAcceptDelay() const
void setDateEditAcceptDelay(int delay)
3、firstDayOfWeek
该属性表示每周的第一天是周几。
Qt::DayOfWeek firstDayOfWeek() const
void setFirstDayOfWeek(Qt::DayOfWeek dayOfWeek)

Qt::DayOfWeek

描述

Qt::Monday

周一

Qt::Tuesday

周二

Qt::Wednesday

周三

Qt::Thursday

周四

Qt::Friday

周五

Qt::Saturday

周六

Qt::Sunday

周日

4、gridVisible

        该属性表示是否显示表格线,默认为false不显示。

bool isGridVisible() const

void setGridVisible(bool show)

5、horizontalHeaderFormat

        该属性表示水平标题的格式。

        SingleLetterDayNames:显示单个字母,比如M表示Monday,中文只会显示周,而不是一、二、三这样,是有bug的,所以该格式只适用于英文。

        ShortDayNames:显示简称名,比如英文Mon表示Monday,中文周一表示星期一。

        LongDayNames:显示全称,比如英文Monday,中文星期一。

        NoHorizontalHeader:不显示水平标题。

HorizontalHeaderFormat horizontalHeaderFormat() const

void setHorizontalHeaderFormat(HorizontalHeaderFormat format)

6、verticalHeaderFormat

        该属性表示垂直标题的格式,默认为ISOWeekNumbers显示为一年中的第几周,还有一种NoVerticalHeader不显示。

VerticalHeaderFormat verticalHeaderFormat() const

void setVerticalHeaderFormat(VerticalHeaderFormat)

7、maximumDate

        该属性表示日历可选择的最大日期,如果设置了最大日期,而选择日期大于最大日期,那么当前日期会被调整。如果使用setSelectedDate选择日期大于最大日期,那么不会生效。

QDate maximumDate() const

void setMaximumDate(const QDate &date)

8、minimumDate

        该属性表示日期可选择的最小日期,效果参照maximumDate。

QDate minimumDate() const

void setMinimumDate(const QDate &date)

9、navigationBarVisible

        该属性表示导航是否显示,默认为true,下个月、上个月、月选择、年选择可视。

bool isNavigationBarVisible() const

void setNavigationBarVisible(bool visible)

10、selectedDate

        该属性表示当前选择的日期,设置不可超出最大值maximumDate和最小值minimumDate范围,否则无效。

QDate selectedDate() const

void setSelectedDate(const QDate &date)

11、selectionMode

        该属性表示用户选择日期的策略。

        默认为SingleSelection,用户可以通过鼠标或者键盘在范围内进行日期的选择。

        还有一种是NoSelection,用户不能选择日期,但是依然可以通过程序selectedDate去选择。

SelectionMode selectionMode() const

void setSelectionMode(SelectionMode mode)

3.2 公共函数

1)dateTextFormat

        获取文本格式,使用QTextCharFormat封装,类包含文本字体属性、布局属性等内容。可返回每个日期的文本格式,使用一个QMap保存每个日期对应的格式,这样Map内容很大,不建议这么干,尽量使用第二个。

QMap<QDate, QTextCharFormat> dateTextFormat() const

QTextCharFormat dateTextFormat(const QDate &date) const

       设置文本格式,使用QTextCharFormat封装,类包含文本字体属性、布局属性等内容。

void setDateTextFormat(const QDate &date, const QTextCharFormat &format)

2)monthShown

        获取当前显示的月份。

int monthShown() const

3)yearShown

        获取当前显示的年份。

int yearShown() const

4)weekdayTextFormat

        获取显示日期的文本格式,参考dateTextFormat

QTextCharFormat weekdayTextFormat(Qt::DayOfWeek dayOfWeek) const

       设置日期显示的文本格式,参考dateTextFormat

void setWeekdayTextFormat(Qt::DayOfWeek dayOfWeek, const QTextCharFormat &format)

5)setCurrentPage

        设置当前要显示年和月,类似setSelectedDate。

void setCurrentPage(int year, int month)

6)setDateRange

        设置当前可选日期的范围,相当于setMaximumDate和setMinimumDate。

void setDateRange(const QDate &min, const QDate &max)

7)showNextMonth

        主动显示下个月。

void showNextMonth()

8)showNextYear

        主动显示下一年。

void showNextYear()

9)showPreviousMonth

        主动显示上个月。

void showPreviousMonth()

10)showPreviousYear

        主动显示上一年。

void showPreviousYear()

11)showSelectedDate

        主动显示当前选择的日期,比如你主动showPreviousMonth显示了上个月,在没有重新选中日期的情况下,使用此函数可以回到当前选择的日期,当然也可以记住选择,用setSelectedDate回到过去。

void showSelectedDate()

  12)showToday

        主动显示系统日期。

void showToday()

3.3 信号

1)activated

        用户按下RETURN键、Enter键或者双击日历的时候触发,得到当前选择的时间。

void activated(const QDate &date)

2)clicked

        用户点击选择时间的时候触发,但是如果用户点击的区域超出范围,或者用户设置选择策略selectionMode为NoSelection,那么不会触发。

void clicked(const QDate &date)

3)currentPageChanged

        当前页改变的时候触发,得到新页的年份和月份。

void currentPageChanged(int year, int month)

4)selectionChanged

        当前选择的日期改变的时候触发,用户可以通过鼠标、键盘或者setSelectedDate改变当前选择的时间。

void selectionChanged()

4.定时器的使用

Qt中的定时器类是QTimeroQTimer不是一个可见的界面组件,在UI设计器的组件面板里

找不到它。

实例程序实现了一个计时器的功能,就是计算定时器开始到停止持续的时间长度,计

时器是QTime类。

QTimer主要的属性是interval,是定时中断的周期,单位毫秒。QTimer主要的信号是timeout(),

在定时中断时发射此信号,要想在定时中断里做出响应,这就需要编写timeout()信号的槽函数。

下面是窗口类中增加的定义(省略了其他不相关的定义):

class Dialog:public QDialog
{
private:QTimer *fTimer;//义了一个定时器fTimerQTime fTimeCounter;//计时器
private slots:void on_timer_timeout();//定时溢出处理槽函数,作为定时器的timeout()信号的响应槽函数。
};

需要在窗口类的构造函数里创建定时器,并进行信号与槽的关联。代码如下:

Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);fTimer=new QTimer(this);  //创建定时器fTimer->stop();fTimer->setInterval(1000);//设置定时周期,单位:毫秒connect(fTimer,SIGNAL(timeout()),this,SLOT(on_timer_timeout())); //关联定时器的信号与槽
}

槽函数on_timer_timeout()的实现代码如下:

void Dialog::on_timer_timeout()
{ //定时器中断响应槽函数QTime curTime=QTime::currentTime(); //获取当前时间ui->LCDHour->display(curTime.hour()); //显示  小时ui->LCDMin->display(curTime.minute());//显示  分钟ui->LCDSec->display(curTime.second());//显示  秒int va=ui->progressBar->value(); //读取progressBar的数值va++;if (va>100)va=0;ui->progressBar->setValue(va); //设置progressBar的数值
}

这段代码首先用QTime类的静态函数Qtime::currentTime()获取当前时间,然后用QTime的成

员函数hour()、minute()、second()分别获取小时、分钟、秒,并在几个LCDNumber组件上显示。

循环更新的值,是为了让界面有变化,表示定时器在运行。

设置定时器的周期,只需调用Qtimer::setlnterval()函数即可。

QTimer::start()函数用于启动定时器,界面上的“开始”按钮代码如下:

void Dialog::on_btnStart_clicked()
{fTimer->start();//定时器开始工作fTimeCounter.start();//计时器开始工作
//更新各按键的状态ui->btnStart->setEnabled(false);ui->btnStop->setEnabled(true);ui->btnSetIntv->setEnabled(false);
}

计时器fTimeCounter执行start()是将当前时间作为计时器的时间。

QTimer::stop()函数停止定时器,界面上的“停止”按钮可实现这一功能,其代码如下:

void Dialog::on_btnStop_clicked()
{fTimer->stop(); //定时器停止int tmMsec=fTimeCounter.elapsed();//毫秒数int ms=tmMsec%1000; //余数毫秒int sec=tmMsec/1000; //整秒QString str=QString::asprintf("流逝时间:%d 秒,%d 毫秒",sec,ms);ui->LabElapsTime->setText(str); //显示流逝的时间ui->btnStart->setEnabled(true); //更新按键状态ui->btnStop->setEnabled(false);ui->btnSetIntv->setEnabled(true);
}

4.实例程序演示时间日期与定时器的使用

(1)main.cpp文件

#include "dialog.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog w;w.show();return a.exec();
}

(2)dialog.h文件

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QTimer>
#include <QTime>namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECT
private:QTimer *fTimer;  //定时器QTime   fTimeCounter;//计时器public:explicit Dialog(QWidget *parent = 0);~Dialog();private slots:void on_timer_timeout(); //定时器中断处理槽函数,手工定义void on_btnGetTime_clicked();//读取当前时间void on_calendarWidget_selectionChanged(); //Calender 选择日期void on_btnSetTime_clicked();  // 读取当前日期时间  按键void on_btnSetDate_clicked(); //设置日期  按键void on_btnSetDateTime_clicked();   //设置日期时间案件void on_btnSetIntv_clicked();   //设置周期  按键void on_btnStart_clicked();  //开始 定时器 按键void on_btnStop_clicked();      //停止定时器按键private:Ui::Dialog *ui;
};#endif // DIALOG_H

(3)dialog.cpp文件

#include "dialog.h"
#include "ui_dialog.h"#include    <QDateTime>
#include    <QString>Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);fTimer=new QTimer(this);  //创建定时器fTimer->stop();fTimer->setInterval(1000);//设置定时周期,单位:毫秒connect(fTimer,SIGNAL(timeout()),this,SLOT(on_timer_timeout())); //关联定时器的信号与槽
}Dialog::~Dialog()
{
//    delete fTimer;delete ui;
}void Dialog::on_timer_timeout()
{ //定时器中断响应槽函数QTime curTime=QTime::currentTime(); //获取当前时间ui->LCDHour->display(curTime.hour()); //显示  小时ui->LCDMin->display(curTime.minute());//显示  分钟ui->LCDSec->display(curTime.second());//显示  秒int va=ui->progressBar->value(); //读取progressBar的数值va++;if (va>100)va=0;ui->progressBar->setValue(va); //设置progressBar的数值
}void Dialog::on_btnGetTime_clicked()
{ //获取当前日期时间,为三个专用编辑器设置日期时间数据,并转换为字符串在LineEdit里显示QDateTime curDateTime=QDateTime::currentDateTime(); //读取当前日期时间ui->timeEdit->setTime(curDateTime.time()); //设置时间ui->editTime->setText(curDateTime.toString("hh:mm:ss"));//转换为字符串显示ui->dateEdit->setDate(curDateTime.date());//设置日期ui->editDate->setText(curDateTime.toString("yyyy-MM-dd"));//转换为字符串显示ui->dateTimeEdit->setDateTime(curDateTime);//设置日期时间ui->editDateTime->setText(curDateTime.toString("yyyy-MM-dd hh:mm:ss"));//转换为字符串显示//    ui->LabDateTime->setText(curDateTime.toString("yyyy-MM-dd hh:mm:ss"));
}void Dialog::on_calendarWidget_selectionChanged()
{ //在日历上选择日期QDate dt=ui->calendarWidget->selectedDate(); //读取选择的日期时间QString str=dt.toString("yyyy年M月d日");//转换为字符串ui->editCalendar->setText(str); //字符串显示日期
}void Dialog::on_btnSetTime_clicked()
{ //字符串转换为QTimeQString str=ui->editTime->text(); //读取字符串表示的时间//    str=str.trimmed();//去掉空格if (!str.isEmpty()){QTime tm=QTime::fromString(str,"hh:mm:ss"); //从字符串转换为QTimeui->timeEdit->setTime(tm); //设置时间}
}void Dialog::on_btnSetDate_clicked()
{//字符串转换为 QDateQString str=ui->editDate->text(); //读取字符串表示的日期
//    str=str.trimmed();//去掉空格if (!str.isEmpty()){QDate dt=QDate::fromString(str,"yyyy-MM-dd");//从字符串转换为 QDateui->dateEdit->setDate(dt);//设置日期}
}void Dialog::on_btnSetDateTime_clicked()
{//字符串转换为 QDateTimeQString str=ui->editDateTime->text();//读取字符串表示的日期str=str.trimmed();//去掉空格if (!str.isEmpty()){QDateTime datetime=QDateTime::fromString(str,"yyyy-MM-dd hh:mm:ss"); //从字符串转换为 QDateTimeui->dateTimeEdit->setDateTime(datetime);//设置日期时间}
}void Dialog::on_btnSetIntv_clicked()
{ //设置定时器周期fTimer->setInterval(ui->spinBoxIntv->value()); //设置定时器的周期
}void Dialog::on_btnStart_clicked()
{fTimer->start();//定时器开始工作fTimeCounter.start();//计时器开始工作
//更新各按键的状态ui->btnStart->setEnabled(false);ui->btnStop->setEnabled(true);ui->btnSetIntv->setEnabled(false);
}void Dialog::on_btnStop_clicked()
{fTimer->stop(); //定时器停止int tmMsec=fTimeCounter.elapsed();//毫秒数int ms=tmMsec%1000; //余数毫秒int sec=tmMsec/1000; //整秒QString str=QString::asprintf("流逝时间:%d 秒,%d 毫秒",sec,ms);ui->LabElapsTime->setText(str); //显示流逝的时间ui->btnStart->setEnabled(true); //更新按键状态ui->btnStop->setEnabled(false);ui->btnSetIntv->setEnabled(true);
}

(4)运行界面

(5)实例程序附件

        附件详见博客上传资源。

https://download.csdn.net/download/u011671745/88625313

相关文章:

  • 二叉树:数据结构中的灵魂
  • 帆软FCRP模拟题
  • 【PHP入门】1.1-PHP初步语法
  • MVC Gantt Wrapper:RadiantQ jQuery
  • 2023/12/17 初始化
  • LCR 180. 文件组合
  • Draw.io or diagrams.net 使用方法
  • python绘制gif动图--避免收费拒绝水印
  • 尚硅谷JavaWeb电子书城项目(Java+Mysql+Tomcat+Jsp)
  • 超详细 | 黏菌算法原理、实现及其改进与利用(Matlab/Python)
  • 直播原理,直播CDN及相关协议
  • Ubuntu 命令行安装 Clang 16或者Clang 17的过程
  • C语言编程题-单身狗
  • Unity_FairyGUI发布导入Unity编辑器资源报错
  • 通配符匹配
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • ComponentOne 2017 V2版本正式发布
  • create-react-app项目添加less配置
  • Laravel 实践之路: 数据库迁移与数据填充
  • PHP 小技巧
  • Python爬虫--- 1.3 BS4库的解析器
  • Sass 快速入门教程
  • Terraform入门 - 3. 变更基础设施
  • TypeScript迭代器
  • vue-router 实现分析
  • 关于List、List?、ListObject的区别
  • 理解在java “”i=i++;”所发生的事情
  • 每天10道Java面试题,跟我走,offer有!
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前端性能优化--懒加载和预加载
  • 悄悄地说一个bug
  • 微信开源mars源码分析1—上层samples分析
  • 正则学习笔记
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (三)模仿学习-Action数据的模仿
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 表达式计算:Expression Evaluator
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • ;号自动换行
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @property python知乎_Python3基础之:property
  • @RestController注解的使用
  • [autojs]autojs开关按钮的简单使用
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [CF226E]Noble Knight's Path
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]
  • [dts]Device Tree机制
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [LeetCode][138]【学习日记】深拷贝带有随机指针的链表
  • [lesson17]对象的构造(上)