时间日期相关的类
- QTime:时间数据类型,仅表示时间,如19:20
- QDate:日期数据类型,仅表示日期,如2019/6/1
- QDateTime:日期时间数据类型,表示时间和日期,如2019-6-1 19:20
QT中专门用于时间、日期编辑显示的组件
- QTimeEdit:编辑和显示时间的组件
- QDateEdit:编辑和显示日期的组件
- QDateTimeEdit:编辑和显示时间和日期的组件
- QCalendarWidget:用日历形式选择时间的组件
定时器是用来处理周期性事件的一种对象,类似于硬件定时器。在设置周期时间后,每隔一个周期便会发送一个timeout()信号,在信号的关联槽函数中就可以做出相应的处理。Qt中的定时器类是QObject类继承而来,不上界面组件类
实例运行效果:
日期时间数据与字符串之间的转换
QDateEdit和QTimeEdit的显示功能都可以通过QDateTimeEdit实现
1.QDateTimeEdit类的主要属性:
- datetime:时间日期
- date:日期,设置datetime会自动改变date;同样,设置date也会使得datetime自动改变
- time:时间,设置datetime会自动改变time;同样,设置time也会使得datetime自动改变
- maximumDateTime、minimumDateTime,最大最小时间日期
- maximumDate(time)、minimumDate(time)同上
- currentSection:用于显示输入光标所在的时间日期数据段,QTimeDateEdit显示时间日期时可以分为多个段(年/月/日),单击编辑框右侧的上下按钮可以修改当前段的值
- displayFormat:显示格式,日期时间数据的显示格式,"yyyy-mm-dd HH:mm:ss"则显示效果为2019-06-1 19:20:12
2.时间数据的获取与转化
使用QDateTime::currentDateTime()可以获取当前系统时间,获取之后可以使用QDateTime::toString和QDateTime::formString()实现字符串和时间数据类型的信息互相转化
具体实现代码:
void Widget::on_btn_read_clicked()
{
//获取系统当前时间并转化为字符串
QDateTime curDateTime = QDateTime::currentDateTime(); //获取系统当前时间
ui->timeEdit->setTime(curDateTime.time());
ui->edit_time->setText(curDateTime.toString("hh:mm:ss"));
ui->dateEdit->setDate(curDateTime.date());
ui->edit_date->setText(curDateTime.toString("yy-mm-dd"));
ui->dateTimeEdit->setDateTime(curDateTime);
ui->edit_datetime->setText(curDateTime.toString("yy-mm-dd hh:mm:ss"));
}
void Widget::on_btn_settime_clicked()
{
//设置时间
QString str = ui->edit_time->text(); //获取edit_time中的数据
str = str.trimmed(); //去除首尾空格
if(!str.isEmpty())
{
//只有输入hh:mm:ss的字符串才能成功转化为时间
QDateTime datetime = QDateTime::fromString(str,"hh:mm:ss");
ui->timeEdit->setTime(datetime.time());
}
}
void Widget::on_btn_setdate_clicked()
{
//设置日期
QString str = ui->edit_date->text(); //获取edit_date中的数据
str = str.trimmed(); //去除首尾空格
if(!str.isEmpty())
{
//只有输入yyyy-mm-dd的字符串才能成功转化为日期
QDateTime datetime = QDateTime::fromString(str,"yyyy-mm-dd");
ui->dateEdit->setDate(datetime.date());
}
}
void Widget::on_btn_setdatetime_clicked()
{
//设置日期时间
QString str = ui->edit_date->text(); //获取edit_datetime中的数据
str = str.trimmed(); //去除首尾空格
if(!str.isEmpty())
{
//只有输入yyyy-mm-dd hh:mm:ss的字符串才能成功转化为日期时间
QDateTime datetime = QDateTime::fromString(str,"yyyy-mm-dd hh:mm:ss");
ui->dateTimeEdit->setDateTime(datetime);
}
}
QCalendarWidget日历组件
QCalendarWidget以日历的形式显示日期,可以用于日期的选择
QCalendarWidget有一个信号selectionChanged(),在日历上选择日期会发射该信号,为此信号编写槽函数如下:
void Widget::on_calendarWidget_selectionChanged()
{
//在日历上选择日期
QDate dt = ui->calendarWidget->selectedDate();
QString str = dt.toString("yyyy年M月dd日");
ui->edit_Calendar->setText(str);
}
定时器的使用
QT中的定时器类是QTimer。QTimer不是一个可见的界面组件,在UI设计界面也没有该组件
要想使用该组件,需要在窗口类Widget.h中增加如下定义
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_timer_timeout();
private:
Ui::Widget *ui;
QTimer *ftimer; //定时器类,需要添加#include <QTimer>
QTimer fTimerCounter; //计时器类
};
在窗口类的构造函数中添加如下定义:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ftimer = new QTimer(this); //同样需要添加头文件#include <QTimer>
ftimer->stop();
ftimer->setInterval(1000); //设置定时器周期,单位毫秒
connect(ftimer,SIGNAL(timeout()),this,SLOT(on_timer_timeout()));
}
QTimer主要的属性是interval,是定时中断的周期,单位毫秒。QTimer的主要信号是timeout(),每隔一个周期就会发射此信号,为该信号编写槽函数
void Widget::on_timer_timeout()
{
//定时器中断响应函数
QTime curTime = QTime::currentTime(); //获取系统当前时间
ui->LCD_1->display(curTime.hour()); //让LCD_1显示当前小时数
ui->LCD_2->display(curTime.minute()); //让LCD_2显示当前分钟数
ui->LCD_3->display(curTime.second()); //让LCD_3显示当前秒数
int val = ui->progressBar->value();
val++; //计时器每触发一次槽函数,val++
if(val > 100)
val = 0;
ui->progressBar->setValue(val); //将进度条进度设置为val
}
控制定时器开始和结束以及设置周期的槽函数如下:
void Widget::on_btn_start_clicked()
{
//定时器开始按钮
ftimer->start();
fTimerCounter.start();
ui->btn_start->setEnabled(false); //点击开始按钮后再次点击不会重新开始
ui->btn_setperiod->setEnabled(false); //点击开始按钮后点击设置周期不会生效
ui->btn_end->setEnabled(true);
}
void Widget::on_btn_setperiod_clicked()
{
//设置周期
QString str = ui->spin_period->text(); //获取spin_period中的内容
if(!str.isEmpty())
ftimer->setInterval(str.toInt());
}
void Widget::on_btn_end_clicked()
{
//定时器停止按钮
ftimer->stop();
ui->btn_start->setEnabled(true);
ui->btn_setperiod->setEnabled(true);
ui->btn_end->setEnabled(false);
}