1 主要类概述
时间日期是经常遇到的数据类型,Qt中的时间日期类如下:
- QTime:时间类型,只表示时间,如15:23:13;
- QDate:日期类型,只表示日期,如2017-4-5;
- QDateTime:日期时间类型,表示日期和时间,如2017-03-23 08:12:43;
Qt中有专门用于日期、时间编辑和显示的界面组件:
- QTimeEdit:编辑和显示时间的组件;编辑时分的小部件
- QDateEdit:编辑和显示日期的组件;编辑日期的小部件
- QDateTimeEdit:编辑和显示日期时间的组件;从名字可知 QDateTimeEdit 类提供了一个用于编辑日期和时间的小部件。QDateTimeEdit允许用户使用键盘或箭头键编辑日期,以增加或减少日期和时间值。箭头键可用于在QDateTimeEdit 框中从一个区域移动到另一个区域。实际上是 QDateTimeEdit 和 QDateEdit 的组合。
- QCalendarWidget:一个用日历形式选择日期的组件。
实例程序samp4_5演示了这些时间日期相关类的使用,其运行界面如下图所示:
2 QDateTime与QString之间的转换
- 时间、日期编辑器属性设置在上图左上角“日期时间”Groupbox中,使用
QTimeEdit
、QDateEdit
、QDateTimeEdit
组件作为时间、日期、日期时间编辑器;在其右侧,各放置一个QLineEdit组件用于字符串显示
。
QDateEdit
与QTimeEdit
都从QDateTimeEdit
继承而来,实现针对日期和时间的特定显示功能
。实际上,QDateEdit
和QTimeEdit
的显示功能都可以通过QDateTimeEdit实现
,只需要设置好属性
就可以了。
QDateTimeEdit类的主要属性如下:
属性 | 说明 |
---|---|
datetime: | 日期时间; |
date: | 日期;设置datetime时会自动改变date;同时,设置date时,也会自动改变datetime中的日期; |
time: | 时间;和date类似,设置datetime和time时会互相改变对方的值; |
maximumDateTime、minimumDateTime: | 最大、最小时间日期; |
maximumTime、minimumTime: | 最大、最小时间; |
currentSection: | 当前输入光标所在的时间日期数据段,是枚举类型QDateTimeEdit::Section。QDateTimeEdit显示日期时间数据时分为多个段,单击编辑框右侧的按钮可以修改当前段的值。如输入光标在Year Section段,就修改“年”的值; |
currentSectionIndex: | 用序号表示输入光标所在的段; |
calendarPopup: | 是否允许弹出一个日历框;取值为true时,右侧的输入按钮变为下拉按钮,单击按钮时出现一个日历框,用于在日历上选择日期。对于QTimeEdit,此属性无效; |
displayFormat: | 格式化显示;如果设置为“yyyy-MM-dd HH:mm:ss”,一个日期时间数据就显示为“2016-11-02 08:23:46” |
2.1 QDateTime的获取与QString的转换
- 读取当前日期时间”按钮的clicked()信号的槽函数中,写如下代码:
void Widget::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类的静态函数currentDateTime()获取当前日期时间,并赋值给变量curDateTime。
-
然后用curDateTime变量设置界面上的3个Date、Time、DateTime,利用QDateTime的time()、date()分别提取time和date。
-
将curDateTime表示的日期时间转换为字符串,然后在LineEdit编辑框上显示。转换时使用了QDateTime的toString()函数,函数参数指定了显示Time、Date、DateTime的格式:
QString QDateTime :: toString ( QString format )
- 它将日期按照format指定的格式转换为字符串。format是一个字符串,包含一些特定的字符,表示Date或Time的各个部分,下表显示了常用format:
- 在设置DateTime显示字符串时,还可以使用填字符,甚至使用汉字。例如:
curDateTime.toString("yyyy年MM月dd日");
这样得到的字符将是“2021年6月6日”。
2.2 QString转换为DateTime
- 将QString转换为QTime、QDate、QDateTime类型,需要使用静态函数QDateTime::fromString():
QDateTime QDateTime :: fromString( string , format )
第一个参数string是DateTime字符串,第二个参数format是格式,按照之前的格式表定义。
在程序运行时,手工修改“日期时间”后面文本框editDateTime中的DateTime字符串,单击“设置日期时间”按钮,可以将文本框中的QString转换为QDateTime变量,并设置为左侧DateTimeEdit组件的DateTime数据:
void Widget::on_btnSetDateTime_clicked()
{
//QString转换为QDateTime
QString str = ui->editDateTime->text();
str = str.trimmed();
if( !str.isEmpty() )
{
QDateTime datetime = QDateTime::fromString(str,"yyyy-MM-dd hh:mm:ss");
ui->dateTimeEdit->setDateTime(datetime);
}
}
2.3 QDateEdit点击弹出日历控件
方法一:在界面中勾选属性
方法二:或在在cpp文件中设置ui->dateEdit->setCalendarPopup(true);
2.4 让QDateEdit显示当前时间
ui->dateEdit->setDisplayFormat("yyyy-MM-dd");
ui->dateEdit->setDateTime(QDateTime::currentDateTime());
2.5 设置QDateEdit弹出日历的样式
其实弹出的是QCalendarWidget控件,设置它的样式即可
我使用的样式表直接设置,样式见下图
3 QCalendarWidget日历组件
图1右侧是QCalendarWidget组件,它以日历的形式显示日期,可以用于日期选择。QCalendarWidget有一个信号selectionChanged(),在日历上选择的日期变化后会发射此信号,为此信号创建槽函数,编写代码如下:
void Dialog :: on_calendarWidget_selectionChanged()
{
//在日历上选择日期
QDate dt = ui->calendarWidget->selectedDate();
QString str = dt.toString("yyyy 年 M 月 d 日");
ui->editCalendar->setText(str);
}
4 官方自带的
要想QDateEdit(或QDateTimeEdit)为弹出日历的形式,则需要先设置setCalendarPopup
(true),必须要先设置这个;然后将自定义的日历进行设置(setCalendarWidget(pCalendar))。
我发现一点就是这个不能设置只读模式(我只是想去掉光标,禁止键盘编辑),这样就是丧失了按钮的使能,所以怎么去掉这个光标呢,等待下一个大佬告诉我!!
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDateTimeEdit>
#include <QTimeEdit>
#include <QDateEdit>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
/* 声明对象 */
QDateTimeEdit *dateTimeEdit;
QTimeEdit *timeEdit;
QDateEdit *dateEdit;
};
#endif // MAINWINDOW_H
源文件“main.cpp”具体代码如下。
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
/* 设置位置与大小 */
this->setGeometry(0, 0, 800, 480);
/*实例化对象,传入当前日期与时间*/
dateTimeEdit = new QDateTimeEdit(
QDateTime::currentDateTime(),this);
dateTimeEdit->setGeometry(300, 200, 200, 30);
/* 弹出日期控件与否 */
//dateTimeEdit->setCalendarPopup(true);
/* 实例化对象,传入当前时间 */
timeEdit = new QTimeEdit(QTime::currentTime(),this);
timeEdit->setGeometry(300, 240, 200, 30);
/* 实例化对象,传入当前日期 */
dateEdit = new QDateEdit(QDate::currentDate(),this);
dateEdit->setGeometry(300, 280, 200, 30);
}
MainWindow::~MainWindow()
{
}