【Qt编程之Widgets模块】-005:QTime、QDate、QDateTime、QTimeEdit、QDateEdit、QDateTimeEdit、QCalendarWidget及基本操作

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中,使用QTimeEditQDateEditQDateTimeEdit组件作为时间、日期、日期时间编辑器;在其右侧,各放置一个QLineEdit组件用于字符串显示

QDateEditQTimeEdit都从QDateTimeEdit继承而来,实现针对日期和时间的特定显示功能。实际上,QDateEditQTimeEdit的显示功能都可以通过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()
{
}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值