【Qt开发】输入类控件(五)-> QDateTimeEdit

目录

[1 -> 概述](#1 -> 概述)

[2 -> 核心属性](#2 -> 核心属性)

[3 -> 核心信号](#3 -> 核心信号)

[4 -> 关键特性与优势](#4 -> 关键特性与优势)

[5 -> 应用场景](#5 -> 应用场景)

[6 -> 代码示例](#6 -> 代码示例)

[6.1 -> 实现日期计算器](#6.1 -> 实现日期计算器)

[7 -> 总结](#7 -> 总结)


1 -> 概述

在图形用户界面开发中,处理日期和时间是极其常见的需求。从设置闹钟、安排会议,到记录数据时间戳,一个直观、可靠且高效的日期时间输入控件至关重要。Qt 框架提供的 QDateTimeEdit 控件,正是为此而生的强大工具,它完美地平衡了功能性与易用性,让开发者能够轻松地为应用程序嵌入专业级的时间管理功能。

QDateTimeEdit 的核心定位是一个用于输入和编辑日期、时间的专用文本框。它并非一个简单的文本输入框,而是一个高度结构化的控件,其内部封装了对日期和时间数据的完整理解。用户不能随意输入无效的字符或格式,这从根源上保证了数据的有效性和一致性。与传统的需要手动验证的文本框相比,QDateTimeEdit 将数据验证内化为其基本行为,极大地提升了应用程序的健壮性。

2 -> 核心属性

|---------------------|-------------------------------------------------------------------------------------------------------------|
| 属性 | 说明 |
| dateTime | 时间日期的值。形如 2025/10/6 0:00:00 |
| date | 单纯日期的值。形如 2025/10/6 |
| time | 单纯时间的值。形如 0:00:00 |
| displayFormat | 时间日期格式。形如 YYYY/M/D H:mm:ss * Y 表示年份 * M 表示月份 * D 表示日期 * H 表示小时 * m 表示分钟 * s 表示秒 |
| minimumDateTime | 最小时间日期 |
| maximumDateTime | 最大时间日期 |
| timeSpec | * Qt::LocalTime:显示本地时间 * Qt::UTC:显示协调世界时间(UTC) * Qt::OffsetFromUTC:显示相对于 UTC 的偏移量(时差) |

关于 本地时间(LocalTime)和 协调世界时间(UTC)

UTC 时间是一个基于原子钟的标准时间。不受地球的自转周期影响。和格林威治时间(GMT)是非常接近的。科学家会通过精密的设备来测量并维护。

我们的计算机内部使用的时间就是基于 UTC 时间。

本地时间则是基于不同的时区,对 UTC 时间做出了一些调整。比如我们使用的北京时间,位于 "东八区",就需要在 UTC 时间基础上 +8 个小时的时差。

3 -> 核心信号

|--------------------------------|-------------------|
| 信号 | 说明 |
| dateChanged(QDate) | 日期改变时触发 |
| timeChanged(QTime) | 时间改变时触发 |
| dateTimeChanged(QDateTime) | 时间日期任意一个改变时触发 |

4 -> 关键特性与优势

  1. 无缝的输入体验
    QDateTimeEdit 提供了两种主流的输入方式:键盘和鼠标。

    • 键盘导航:用户可以使用键盘的上、下方向键快速递增或递减当前选中的部分(如年、月、日、时、分等),这种方式精准而高效。

    • 鼠标交互:控件右侧通常带有上下箭头按钮,点击即可调整数值。更直观的是,它可以直接呼出日历弹出窗口(对于日期部分),用户只需点击即可完成日期选择,极大地提升了操作速度。

  2. 内在的自动验证
    这是 QDateTimeEdit 最显著的优势之一。控件自动处理所有边界情况。例如,当用户将日期从1月31日递增时,它会自动跳转到2月1日;它知道每个月的正确天数,并能正确处理闰年。对于时间部分,分钟和秒数在达到60后会自动归零并进位。这种内置的智能验证机制,完全消除了开发者手动编写复杂验证逻辑的负担。

  3. 极致的灵活性
    QDateTimeEdit 并非一个单一的控件,而是一个灵活的基础。Qt 基于它衍生出了两个专门化的控件:

    • QDateEdit:专注于日期部分(年、月、日),隐藏了时间输入,界面更加简洁。

    • QTimeEdit :专注于时间部分(时、分、秒),不显示日期。
      这种设计允许开发者根据具体场景选择最合适的控件,避免呈现给用户不必要的选项。

  4. 高度的可定制性
    控件的外观和行为可以被精细地调整。

    • 显示格式:开发者可以自定义日期时间的显示格式。无论是国际通用的 "yyyy-MM-dd HH:mm:ss",还是更口语化的 "ddd, MMM d, yyyy",都可以轻松设置。这确保了控件能够适应不同地区和文化的用户习惯。

    • 时间范围:可以设置控件允许的最小和最大日期时间。例如,在预订机票的应用中,可以将出发日期限制为从今天开始往后的日期,从而防止用户选择过去的无效日期。

    • 日历弹出:可以启用或禁用日历弹出窗口,并根据需要定制日历系统的类型(如格里高利历、农历等)。

5 -> 应用场景

QDateTimeEdit 的应用场景无处不在:

  • 数据录入表单:在需要记录创建时间、生效时间、生日等信息的业务系统中。

  • 计划与任务应用:用于设置任务的开始时间、截止日期和提醒时间。

  • 数据分析与报表:作为过滤器,让用户选择查询数据的时间范围。

  • 系统设置:用于设置系统时间或应用程序的特定时间参数。

6 -> 代码示例

6.1 -> 实现日期计算器

1. 在界面上创建两个 QDateTimeEdit 和一个按钮,一个 label

2. 编写计算按钮的 slot 函数

  • 使用 daysTo 函数可以计算两个日期的天数
  • 使用 secsTo 函数可以计算两个时间的秒数
  • 通过(秒数 / 3600)换算成小时数,再余上 24 得到零几个小时
  • 使用 QString::number 把整数转成 QString 进行拼接
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    // 获取时间
    QDateTime timeOld = ui->dateTimeEdit->dateTime();
    QDateTime timeNew = ui->dateTimeEdit_2->dateTime();

    qDebug() << timeOld << timeNew;

    // 计算差值
    // int days = timeOld.daysTo(timeNew);
    int seconds = timeOld.secsTo(timeNew);

    // 把秒换成小时与天数
    int hours = (seconds / 3600) % 24;
    int days = (seconds / 3600) / 24;

    ui->label->setText(QString("爱你已经持续了 ") + QString::number(days)
                       + QString(" 天 零 ") + QString::number(hours) + QString(" 小时"));

}

3. 执行程序,观察结果

7 -> 总结

QDateTimeEdit 是 Qt 框架中一个设计精良、功能完备的控件。它将复杂的日期时间处理逻辑封装在一个简单易用的界面之下,既为终端用户提供了流畅、无错的输入体验,也为开发者节省了大量的开发和调试时间。通过其灵活性、可定制性和内在的数据验证能力,QDateTimeEdit 确保了在任何需要处理时间信息的 Qt 应用程序中,开发者都能找到一个可靠、高效的解决方案。选择它,意味着为您的应用选择了一份对时间和数据的精准掌控。


感谢各位大佬支持!!!

互三啦!!!

相关推荐
摸鱼仙人~19 分钟前
一文深入学习Java动态代理-JDK动态代理和CGLIB
java·开发语言·学习
lsnm29 分钟前
C++新手项目-JsonRPC框架
开发语言·c++·1024程序员节
晨陌y31 分钟前
从 0 到 1 开发 Rust 分布式日志服务:高吞吐设计 + 存储优化,支撑千万级日志采集
开发语言·分布式·rust
微信api接口介绍1 小时前
微信个人发消息api
运维·服务器·开发语言·前端·网络·微信·ipad
小二·1 小时前
仓颉语言中Channel通道的深度解析:从原理到高并发实践
开发语言
南方的狮子先生1 小时前
【数据结构】从线性表到排序算法详解
开发语言·数据结构·c++·算法·排序算法·1024程序员节
froginwe112 小时前
HTML5 Audio(音频)
开发语言
程序员皮皮林2 小时前
Java 25 正式发布:更简洁、更高效、更现代!
java·开发语言·python
ArabySide2 小时前
【Java】理解Java内存中堆栈机制与装箱拆箱的底层逻辑
java·开发语言