日期类数据和控件管理

目录

QTime

API

QDate

API

QDateTime

QDateTimeEdit

API

QCalendarWidget

API

测试样例(参考了《Qt6开发指南》)


(严肃提示:笔者认为这里的控件没有难点,本篇文章实际上是GPT辅助的代码整理和表格使用,笔者建议如果不是速览存在的API,笔者建议您不要浪费时间阅读本篇文章,后续笔者使用到了会再次重写本篇文章!)(本篇文章是备忘)

QTime

QTime 对象表示时钟时间,可以用自午夜以来的小时、分钟、秒和毫秒数来表达。它提供了一系列功能,用于比较时间和通过添加指定毫秒数来操作时间。由于 QTime 仅仅封装了整数,因此建议按值传递,而不是通过 const 引用。QTime 使用 24 小时制,不包含 AM/PM 的概念。与 QDateTime 不同,QTime 不涉及时区或夏令时(DST)。

创建 QTime 对象的常见方法包括显式给出小时、分钟、秒和毫秒,或者使用静态函数 currentTime(),后者生成一个表示系统本地时间的 QTime 对象。通过调用 hour()minute()second()msec() 函数,可以获取 QTime 对象的小时、分钟、秒和毫秒数。这些信息也可以通过 toString() 函数以文本格式提供。addSecs()addMSecs() 函数允许计算在给定时间之后增加一定秒数或毫秒数的时间。相应地,secsTo()msecsTo() 函数可用于计算两个时间之间的秒数或毫秒数差。QTime 提供了一整套运算符,用于比较两个 QTime 对象。较早的时间被视为较小的时间。如果 A.msecsTo(B) 的结果为正,那么可以得出 A < B 的结论。此外,QTime 对象还可以通过 fromString() 方法从文本表示中创建,并使用 toString() 方法转换为字符串表示。所有字符串格式的转换都使用 C 语言环境进行。如果需要本地化的转换,可以使用 QLocale。这种设计使得 QTime 能够方便地处理和显示时间,适应不同的应用场景。

API

类型成员函数/操作用途说明
构造函数QTime()默认构造函数,创建一个无效的时间对象。
QTime(int h, int m, int s = 0, int ms = 0)根据小时、分钟、秒和毫秒创建一个时间对象。
成员函数QTime addMSecs(int ms) const返回当前时间加上指定毫秒后的新时间。
QTime addSecs(int s) const返回当前时间加上指定秒数后的新时间。
int hour() const返回小时部分(0-23)。
bool isNull() const检查时间对象是否为空(无效)。
bool isValid() const检查时间对象是否有效(合理的时间值)。
int minute() const返回分钟部分(0-59)。
int msec() const返回毫秒部分(0-999)。
int msecsSinceStartOfDay() const返回自当天开始至当前时间的毫秒数。
int msecsTo(QTime t) const返回当前时间到指定时间的毫秒差。
int second() const返回秒部分(0-59)。
int secsTo(QTime t) const返回当前时间到指定时间的秒差。
bool setHMS(int h, int m, int s, int ms = 0)设置时间的小时、分钟、秒和毫秒部分。
QString toString(QStringView format) const根据指定格式返回时间的字符串表示。
QString toString(const QString &format) const根据指定格式返回时间的字符串表示(另一种重载)。
QString toString(Qt::DateFormat format = Qt::TextDate) const返回时间的字符串表示,格式取决于 Qt::DateFormat
静态公共成员QTime currentTime()获取当前系统时间。
QTime fromMSecsSinceStartOfDay(int msecs)根据从午夜开始的毫秒数创建时间对象。
QTime fromString(const QString &string, Qt::DateFormat format = Qt::TextDate)从字符串创建时间对象,格式根据指定的 DateFormat
QTime fromString(const QString &string, const QString &format)从字符串创建时间对象,格式根据自定义格式。
QTime fromString(QStringView string, QStringView format) (since 6.0)从字符串创建时间对象,使用 QStringView 类型。
QTime fromString(QStringView string, Qt::DateFormat format = Qt::TextDate) (since 6.0)从字符串创建时间对象,格式根据指定的 DateFormat
QTime fromString(const QString &string, QStringView format) (since 6.0)从字符串创建时间对象,使用 QStringView 类型和自定义格式。
bool isValid(int h, int m, int s, int ms = 0)检查给定的小时、分钟、秒和毫秒是否是有效的时间值。
相关非成员操作bool operator!=(const QTime &lhs, const QTime &rhs)判断两个时间对象是否不相等。
bool operator<(const QTime &lhs, const QTime &rhs)判断第一个时间是否小于第二个时间。
QDataStream & operator<<(QDataStream &out, QTime time)将时间对象写入数据流。
bool operator<=(const QTime &lhs, const QTime &rhs)判断第一个时间是否小于或等于第二个时间。
bool operator==(const QTime &lhs, const QTime &rhs)判断两个时间对象是否相等。
bool operator>(const QTime &lhs, const QTime &rhs)判断第一个时间是否大于第二个时间。
bool operator>=(const QTime &lhs, const QTime &rhs)判断第一个时间是否大于或等于第二个时间。
QDataStream & operator>>(QDataStream &in, QTime &time)从数

QDate

QDate 对象表示特定的一天,不受创建时所用的日历、区域设置或系统设置的影响。它可以报告与公历(proleptic Gregorian calendar)或任何提供的 QCalendar 对象相关的年份、月份和日期。QDate 对象应通过值传递而非通过常量引用传递,因为它们封装了 qint64

通常,通过显式提供年、月和日期来创建 QDate 对象。需要注意的是,QDate 将年份小于100的数字视为实际年份,即1到99年,而不添加任何偏移量。静态函数 currentDate() 会创建一个包含从系统时钟读取的日期的 QDate 对象。也可以使用 setDate() 方法设置明确的日期。fromString() 函数根据字符串和日期格式返回一个 QDate 对象,这个格式用于解释字符串中的日期。

year()month()day() 函数提供对年份、月份和日期的访问。当需要多个值时,调用 QCalendar::partsFromDate() 会更高效,以避免重复计算可能昂贵的日历信息。

此外,还提供了 dayOfWeek()dayOfYear() 函数。通过 toString() 函数可以以文本格式提供相同的信息,QLocale 可以将日期数字映射到名称,QCalendar 可以将月份数字映射到名称。

QDate 提供了一整套运算符来比较两个 QDate 对象,其中较小的表示较早,较大的表示较晚。通过 addDays() 方法递增(或递减)日期,同样可以使用 addMonths()addYears()daysTo() 函数返回两个日期之间的天数。daysInMonth()daysInYear() 函数分别返回该日期所在的月份和年份中的天数。isLeapYear() 函数指示给定日期是否在闰年中,QCalendar 也可以提供此信息,通常更加方便。

QDate 对象的转换操作均使用 C 语言的区域设置进行,因此在处理本地化转换时,请参阅 QLocale

在公历中,没有“0年”。该年份的日期被视为无效。“-1年”是指“公元前1年”。公元1年1月1日的前一天(QDate(1, 1, 1))是公元前1年12月31日(QDate(-1, 12, 31))。其他一些日历系统的行为也类似,详细信息可见 QCalendar::hasYearZero()

QDate 在内部将日期存储为一个儒略日数(Julian Day number),这是一个对每一天的连续计数,其中公历的4714 BCE年11月24日对应的儒略日数为0(而公历的4713 BCE年1月1日则对应于儒略历)。这种存储方式不仅高效且准确,适合将日期转换为其他日历系统,如希伯来历、伊斯兰历或中国历法。可以通过 QDate::toJulianDay() 获取儒略日数,通过 QDate::fromJulianDay() 设置。

由于技术原因,QDate 能表示的儒略日数范围限于 -784350574879 到 784354017364,这意味着它可以表示从公元前20亿年到公元后20亿年之间的日期。这个范围是 QDateTime 可表示日期范围的七倍多。

API

函数/操作描述
构造函数
QDate()创建一个无效的日期对象。
QDate(int y, int m, int d)根据年、月、日创建一个 QDate 对象。
日期操作
QDate addDays(qint64 ndays) const返回当前日期加上指定天数后的新日期。
QDate addMonths(int nmonths) const返回当前日期加上指定月数后的新日期。
QDate addYears(int nyears) const返回当前日期加上指定年数后的新日期。
int day() const返回当前日期中的日部分。
int month() const返回当前日期中的月部分。
int year() const返回当前日期中的年部分。
int dayOfWeek() const返回当前日期是星期几(1-7)。
bool isNull() const检查日期对象是否为空(无效)。
bool isValid() const检查日期对象是否有效。
QString toString(QStringView format) const根据指定格式返回日期的字符串表示。
qint64 toJulianDay() const返回对应的儒略日。
void getDate(int *year, int *month, int *day) const获取年、月、日的值。
bool setDate(int year, int month, int day)设置日期为指定的年、月、日。
int daysTo(QDate d) const返回当前日期到指定日期之间的天数。
QDateTime endOfDay(const QTimeZone &zone) const返回指定时区的当天结束时间。
QDateTime startOfDay(const QTimeZone &zone) const返回指定时区的当天开始时间。
静态公共成员
QDate currentDate()获取当前系统日期。
QDate fromJulianDay(qint64 jd)根据儒略日创建 QDate 对象。
bool isLeapYear(int year)检查给定年份是否为闰年。
bool isValid(int year, int month, int day)检查给定的年、月、日是否构成有效日期。
QDate fromString(const QString &string, Qt::DateFormat format)从字符串创建 QDate 对象,格式可指定。
相关非成员操作
bool operator==(const QDate &lhs, const QDate &rhs)判断两个日期是否相等。
bool operator<(const QDate &lhs, const QDate &rhs)判断左侧日期是否早于右侧日期。
QDataStream & operator<<(QDataStream &out, QDate date)将日期写入数据流。
QDataStream & operator>>(QDataStream &in, QDate &date)从数据流读取日期。

QDateTime

是上面两者的复合:

QDateTime 是 Qt 框架中用于表示日期和时间的类,结合了 QDate 和 QTime 的特性。QDateTime 可以表示多种时间格式,包括本地时间、UTC、指定的 UTC 偏移量和指定的时区。这些时间表示可以通过 QTimeZone 类进行封装。例如,当你指定一个时区(如“Europe/Berlin”)时,QDateTime 会自动考虑该时区的夏令时规则。创建和修改 QDateTime 对象可以通过多种方式实现。你可以在构造函数中直接提供日期和时间,或者使用静态函数如 currentDateTime() 获取当前的日期和时间,或者通过 fromMSecsSinceEpoch() 方法将自 1970 年 1 月 1 日以来的毫秒数转换为 QDateTime。此外,你可以使用 setDate()setTime() 方法来修改现有的 QDateTime 对象。比较和算术运算方面,QDateTime 提供了一整套运算符,允许你比较两个 QDateTime 对象。你还可以使用如 addMSecs()addSecs()addDays()addMonths()addYears() 方法对日期和时间进行增减操作,这些操作会考虑夏令时的变化。在时区处理上,QDateTime 会自动考虑时区的转换和夏令时(DST)的变化。通过调用 toTimeZone() 方法,你可以将 QDateTime 对象转换为另一种时间表示。在转换和格式化方面,QDateTime 提供了 toString() 方法,将其转换为字符串格式。你也可以使用 fromString() 方法从字符串创建 QDateTime 对象。需要注意的是,字符串的转换使用 C 语言环境,若需本地化转换,可以使用 QLocale 类。关于有效日期范围,QDateTime 的日期范围约为 ±2.92 亿年,这与其内部实现有关。因此,在创建极端日期时间时,需要小心以避免溢出。最后,值得注意的是,QDateTime 不处理闰秒,并且在使用本地时间或指定时区时,可能会引入性能开销,尤其是在时间转换和创建时。此外,在夏令时的过渡期间,某些时间可能会变得无效或模糊,例如在“春季前进”时钟从 2 点跳到 3 点的情况下

类别函数/成员描述
构造函数QDateTime()默认构造函数。
QDateTime(QDate date, QTime time, Qt::TimeSpec spec, int offsetSeconds = 0)带有日期、时间、时间规格和偏移的构造函数(自 6.9 起不推荐使用)。
QDateTime(QDate date, QTime time, const QTimeZone &timeZone, QDateTime::TransitionResolution resolve)带有日期、时间和时区的构造函数。
QDateTime(const QDateTime &other)拷贝构造函数。
QDateTime(QDateTime &&other)移动构造函数。
~QDateTime()析构函数。
日期/时间操作QDateTime addDays(qint64 ndays) const向日期/时间添加天数。
QDateTime addDuration(std::chrono::milliseconds msecs) const向日期/时间添加持续时间(毫秒)。
QDateTime addMSecs(qint64 msecs) const向日期/时间添加毫秒。
QDateTime addMonths(int nmonths) const向日期/时间添加月份。
QDateTime addSecs(qint64 s) const向日期/时间添加秒数。
QDateTime addYears(int nyears) const向日期/时间添加年数。
访问器QDate date() const返回日期部分。
QTime time() const返回时间部分。
bool isDaylightTime() const检查日期/时间是否在夏令时。
bool isNull() const检查日期/时间是否为空。
bool isValid() const检查日期/时间是否有效。
int offsetFromUtc() const返回与 UTC 的偏移量。
QTimeZone timeZone() const返回时区。
设置器void setDate(QDate date)设置日期部分。
void setTime(QTime time)设置时间部分。
void setMSecsSinceEpoch(qint64 msecs)设置自纪元以来的毫秒数。
void setSecsSinceEpoch(qint64 secs)设置自纪元以来的秒数。

QDateTimeEdit

QDateTimeEdit 允许用户通过键盘或箭头键编辑日期,增加或减少日期和时间值。箭头键可以在 QDateTimeEdit 框内的各个部分之间移动。日期和时间的显示格式由 setDisplayFormat() 方法控制。

QDateTimeEdit *dateEdit = new QDateTimeEdit(QDate::currentDate());
dateEdit->setMinimumDate(QDate::currentDate().addDays(-365));
dateEdit->setMaximumDate(QDate::currentDate().addDays(365));
dateEdit->setDisplayFormat("yyyy.MM.dd");

在上述代码中,我们创建了一个新的 QDateTimeEdit 对象,初始化为今天的日期,并将有效日期范围限制为今天前后各365天。显示格式设置为“年.月.日”。QDateTimeEdit 的有效值范围由 minimumDateTimemaximumDateTime 及其相应的日期和时间组件控制。默认情况下,任何从公元100年到公元9999年的日期时间都是有效的。QDateTimeEdit 可以配置为允许使用 QCalendarWidget 选择日期。通过设置 calendarPopup 属性可以启用该功能。此外,可以通过调用 setCalendarWidget() 函数提供自定义的日历小部件。可以使用 calendarWidget() 获取当前的日历小部件。

当启用键盘跟踪(默认情况下),每次编辑字段的按键输入都会触发值变化的信号。如果允许的范围比某个时间区间狭窄,并且该区间的结束日期被该范围包含,则键盘跟踪会阻止用户编辑日期或时间以访问该区间的后半部分。例如,在2020年4月29日到2020年5月2日的范围内,初始日期为2020年4月30日,用户无法更改月份(5月30日超出范围)或日期(4月2日超出范围)。当禁用键盘跟踪时,只有在焦点离开文本字段后,编辑内容发生更改时才会发出信号。这允许用户通过无效的日期时间进行编辑,以达到有效的日期时间。

API

函数签名详细用途
QDateTimeEdit(QWidget *parent = nullptr)构造函数,创建一个空的日期时间编辑框。
QDateTimeEdit(QDate date, QWidget *parent = nullptr)构造函数,创建一个日期时间编辑框,并初始化为指定的日期。
QDateTimeEdit(QTime time, QWidget *parent = nullptr)构造函数,创建一个日期时间编辑框,并初始化为指定的时间。
QDateTimeEdit(const QDateTime &datetime, QWidget *parent = nullptr)构造函数,创建一个日期时间编辑框,并初始化为指定的日期时间。
virtual ~QDateTimeEdit()析构函数,释放日期时间编辑框的资源。
QCalendar calendar() const获取当前使用的日历。
bool calendarPopup() const检查日历弹出窗口是否启用。
QCalendarWidget * calendarWidget() const获取当前使用的日历小部件。
void clearMaximumDate()清除最大日期限制。
void clearMaximumDateTime()清除最大日期时间限制。
void clearMaximumTime()清除最大时间限制。
void clearMinimumDate()清除最小日期限制。
void clearMinimumDateTime()清除最小日期时间限制。
void clearMinimumTime()清除最小时间限制。
QDateTimeEdit::Section currentSection() const获取当前选中的日期时间部分(如年、月、日等)。
int currentSectionIndex() const获取当前选中的部分的索引。
QDate date() const获取当前日期。
QDateTime dateTime() const获取当前日期时间。
QString displayFormat() const获取当前显示格式。
QDateTimeEdit::Sections displayedSections() const获取当前显示的日期时间部分。
QDate maximumDate() const获取最大日期限制。
QDateTime maximumDateTime() const获取最大日期时间限制。
QTime maximumTime() const获取最大时间限制。
QDate minimumDate() const获取最小日期限制。
QDateTime minimumDateTime() const获取最小日期时间限制。
QTime minimumTime() const获取最小时间限制。
QDateTimeEdit::Section sectionAt(int index) const获取指定索引位置的日期时间部分。
int sectionCount() const获取日期时间编辑框中部分的数量。
QString sectionText(QDateTimeEdit::Section section) const获取指定部分的文本表示。
void setCalendar(QCalendar calendar)设置使用的日历类型。
void setCalendarPopup(bool enable)设置是否启用日历弹出窗口。
void setCalendarWidget(QCalendarWidget *calendarWidget)设置使用的日历小部件。
void setCurrentSection(QDateTimeEdit::Section section)设置当前选中的日期时间部分。
void setCurrentSectionIndex(int index)设置当前选中的部分的索引。
void setDateRange(QDate min, QDate max)设置日期范围限制。
void setDateTimeRange(const QDateTime &min, const QDateTime &max)设置日期时间范围限制。
void setDisplayFormat(const QString &format)设置日期时间的显示格式。
void setMaximumDate(QDate max)设置最大日期限制。
void setMaximumDateTime(const QDateTime &dt)设置最大日期时间限制。
void setMaximumTime(QTime max)设置最大时间限制。
void setMinimumDate(QDate min)设置最小日期限制。
void setMinimumDateTime(const QDateTime &dt)设置最小日期时间限制。
void setMinimumTime(QTime min)设置最小时间限制。
void setSelectedSection(QDateTimeEdit::Section section)设置选中的日期时间部分。
void setTimeRange(QTime min, QTime max)设置时间范围限制。
void setTimeSpec(Qt::TimeSpec spec)设置时间规格(如UTC或本地时间)。
void setTimeZone(const QTimeZone &zone)设置时区。
QTime time() const获取当前时间。
Qt::TimeSpec timeSpec() const获取当前时间规格。
QTimeZone timeZone() const获取当前时区。
virtual void clear() override清空当前输入的日期时间。
virtual bool event(QEvent *event) override处理事件,重写父类事件处理函数。
virtual QSize sizeHint() const override返回建议的大小。
virtual void stepBy(int steps) override步进改变日期时间的值。
void setDate(QDate date)设置当前日期。
void setDateTime(const QDateTime &dateTime)设置当前日期时间。
void setTime(QTime time)设置当前时间。
void dateChanged(QDate date)日期改变信号。
void dateTimeChanged(const QDateTime &datetime)日期时间改变信号。
void timeChanged(QTime time)时间改变信号。
virtual QDateTime dateTimeFromText(const QString &text) const从文本获取日期时间。
virtual QString textFromDateTime(const QDateTime &dateTime) const将日期时间转换为文本。
virtual void fixup(QString &input) const override修正输入文本格式。
virtual void focusInEvent(QFocusEvent *event) override处理焦点进入事件。
virtual bool focusNextPrevChild(bool next) override处理焦点转移事件。
virtual void initStyleOption(QStyleOptionSpinBox *option) const override初始化样式选项。
virtual void keyPressEvent(QKeyEvent *event) override处理键盘按下事件。
virtual void mousePressEvent(QMouseEvent *event) override处理鼠标按下事件。
virtual void paintEvent(QPaintEvent *event) override处理绘制事件。
virtual QAbstractSpinBox::StepEnabled stepEnabled() const override获取步进可用性状态。
virtual QValidator::State validate(QString &text, int &pos) const override验证输入文本的有效性。
virtual void wheelEvent(QWheelEvent *event) override处理滚轮事件。

QCalendarWidget

QCalendarWidget 初始化时显示当前月份和年份。它提供多个公共槽函数来更改显示的年份和月份。

  • 默认情况下,今天的日期被选中,用户可以通过鼠标和键盘选择日期。

  • 使用 selectedDate() 函数可以获取当前选中的日期。

  • 可以通过设置 minimumDatemaximumDate 属性来限制用户的选择范围。也可以使用 setDateRange() 一次性设置这两个属性。

  • 如果将 selectionMode 属性设置为 NoSelection,则禁止用户选择日期。

  • 还可以使用 setSelectedDate() 函数程序matically 选择日期。

  • 使用 monthShown()yearShown() 函数可以获取当前显示的月份和年份。

  • 新创建的日历小部件使用缩写的星期几名称,并将周六和周日标记为红色。

  • 日历网格默认不可见,显示周数,第一列的天是该日历区域的第一天。

  • 可以通过设置

    horizontalHeaderFormat

    属性来更改星期几名称的表示方式:

    • 设置为 QCalendarWidget::SingleLetterDayNames 使用单字母缩写(如 "M" 表示 "Monday")。

    • 设置为 QCalendarWidget::LongDayNames 显示完整的星期几名称。

  • 可以通过将 verticalHeaderFormat 属性设置为 QCalendarWidget::NoVerticalHeader 来移除周数。

  • 可以通过

    setGridVisible(true)

    打开日历网格:

    QCalendarWidget *calendar;
    calendar->setGridVisible(true);
  • 使用 setFirstDayOfWeek() 函数可以改变第一列的天。

QCalendarWidget 提供三个信号:

  • selectionChanged()

  • activated()

  • currentPageChanged() 这些信号可以响应用户的交互。

可以通过设置 QTextCharFormat 来大幅自定义标题、星期几或单日的渲染。当前,QTextCharFormat 的前景、背景和字体属性用于确定小部件中单元格的渲染。

API

函数签名详细用途
QCalendarWidget(QWidget *parent = nullptr)构造函数,创建一个日历小部件。
virtual ~QCalendarWidget()析构函数,释放日历小部件的资源。
QCalendar calendar() const获取当前使用的日历。
void clearMaximumDate()清除最大日期限制。
void clearMinimumDate()清除最小日期限制。
int dateEditAcceptDelay() const获取日期编辑接受延迟。
QMap<QDate, QTextCharFormat> dateTextFormat() const获取所有日期的文本格式映射。
QTextCharFormat dateTextFormat(QDate date) const获取指定日期的文本格式。
Qt::DayOfWeek firstDayOfWeek() const获取一周的第一天。
QTextCharFormat headerTextFormat() const获取表头文本格式。
QCalendarWidget::HorizontalHeaderFormat horizontalHeaderFormat() const获取水平表头格式。
bool isDateEditEnabled() const检查日期编辑是否启用。
bool isGridVisible() const检查网格是否可见。
bool isNavigationBarVisible() const检查导航栏是否可见。
QDate maximumDate() const获取最大日期限制。
QDate minimumDate() const获取最小日期限制。
int monthShown() const获取当前显示的月份。
QDate selectedDate() const获取当前选中的日期。
QCalendarWidget::SelectionMode selectionMode() const获取当前的选择模式。
void setCalendar(QCalendar c)设置使用的日历类型。
void setDateEditAcceptDelay(int delay)设置日期编辑接受延迟。
void setDateEditEnabled(bool enable)启用或禁用日期编辑。
void setDateTextFormat(QDate date, const QTextCharFormat &format)设置指定日期的文本格式。
void setFirstDayOfWeek(Qt::DayOfWeek dayOfWeek)设置一周的第一天。
void setHeaderTextFormat(const QTextCharFormat &format)设置表头文本格式。
void setHorizontalHeaderFormat(QCalendarWidget::HorizontalHeaderFormat format)设置水平表头格式。
void setMaximumDate(QDate date)设置最大日期限制。
void setMinimumDate(QDate date)设置最小日期限制。
void setSelectionMode(QCalendarWidget::SelectionMode mode)设置选择模式。
void setVerticalHeaderFormat(QCalendarWidget::VerticalHeaderFormat format)设置垂直表头格式。
void setWeekdayTextFormat(Qt::DayOfWeek dayOfWeek, const QTextCharFormat &format)设置指定星期几的文本格式。
QCalendarWidget::VerticalHeaderFormat verticalHeaderFormat() const获取垂直表头格式。
QTextCharFormat weekdayTextFormat(Qt::DayOfWeek dayOfWeek) const获取指定星期几的文本格式。
int yearShown() const获取当前显示的年份。
virtual QSize minimumSizeHint() const override返回最小大小提示。
virtual QSize sizeHint() const override返回建议的大小。
void setCurrentPage(int year, int month)设置当前显示的页面(年份和月份)。
void setDateRange(QDate min, QDate max)设置日期范围限制。
void setGridVisible(bool show)设置网格是否可见。
void setNavigationBarVisible(bool visible)设置导航栏是否可见。
void setSelectedDate(QDate date)设置当前选中的日期。
void showNextMonth()显示下一个月份。
void showNextYear()显示下一年。
void showPreviousMonth()显示上一个月份。
void showPreviousYear()显示上一年。
void showSelectedDate()显示当前选中的日期。
void showToday()显示今天的日期。
void activated(QDate date)日期激活信号。
void clicked(QDate date)日期点击信号。
void currentPageChanged(int year, int month)当前页面改变信号。
void selectionChanged()选择改变信号。
virtual void paintCell(QPainter *painter, const QRect &rect, QDate date) const绘制单元格,重写父类函数。
void updateCell(QDate date)更新指定日期的单元格。
void updateCells()更新所有单元格。
virtual bool event(QEvent *event) override处理事件,重写父类事件处理函数。
virtual bool eventFilter(QObject *watched, QEvent *event) override事件过滤器,重写父类函数。
virtual void keyPressEvent(QKeyEvent *event) override处理键盘按下事件。
virtual void mousePressEvent(QMouseEvent *event) override处理鼠标按下事件。
virtual void resizeEvent(QResizeEvent *event) override处理调整大小事件。

测试样例(参考了《Qt6开发指南》)

测试样例:

#include "widget.h"
#include "ui_widget.h"
​
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);
}
​
Widget::~Widget()
{delete ui;
}
​
//"读取当前日期时间"按钮
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"));//转换为字符串显示
}
​
//"设置时间fromString"按钮
void Widget::on_btnSetTime_clicked()
{QString str=ui->editTime->text(); //读取字符串表示的时间str=str.trimmed();      //去掉可能的多余空格if (!str.isEmpty()){QTime tm=QTime::fromString(str,"hh:mm:ss"); //从字符串转换为QTimeui->timeEdit->setTime(tm); //设置时间}
}
​
//"设置日期fromString"按钮
void Widget::on_btnSetDate_clicked()
{QString str=ui->editDate->text(); //读取字符串表示的日期str=str.trimmed();      //去掉可能的多余空格if (!str.isEmpty()){QDate dt=QDate::fromString(str,"yyyy-MM-dd");//从字符串转换为 QDateui->dateEdit->setDate(dt);//设置日期}
}
​
//"日期时间fromString"按钮
void Widget::on_btnSetDateTime_clicked()
{QString 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);//设置日期时间}
}
​
//日历组件的selectionChanged()信号
void Widget::on_calendarWidget_selectionChanged()
{QDate dt=ui->calendarWidget->selectedDate();     //读取选择的日期时间QString str=dt.toString("yyyy年M月d日");ui->editCalendar->setText(str);
}
​
void Widget::on_btnDebugTime_clicked()
{QTime TM1(13,24,5);         //定义变量,初始化设置时间QString str= TM1.toString("HH:mm:ss");qDebug("Original time= %s",str.toLocal8Bit().data());
​QTime TM2= TM1.addSecs(150); //延后150秒str= TM2.toString("HH:mm:ss");qDebug("150s later, time= %s",str.toLocal8Bit().data());
​
​TM2= QTime::currentTime();   //获取当前时间str= TM2.toString("HH:mm:ss zzz");qDebug("Current time= %s",str.toLocal8Bit().data());qDebug("Hour= %d",TM2.hour());qDebug("Minute= %d",TM2.minute());qDebug("Second= %d",TM2.second());qDebug("MSecond= %d",TM2.msec());
}
​
​
void Widget::on_btnDebugDate_clicked()
{QDate DT1(2021,7,6);    //初始化日期QString str= DT1.toString("yyyy-MM-dd");qDebug("DT1= %s",str.toLocal8Bit().data());
​
​QDate DT2;DT2.setDate(2021,8,25);    //设置日期str= DT2.toString("yyyy-MM-dd");qDebug("DT2= %s",str.toLocal8Bit().data());qDebug("Days between DT2 and DT1= %lld",DT2.daysTo(DT1)); //DT2与DT1之间相差的天数
​DT2= QDate::currentDate();   //获取当前日期str= DT2.toString("yyyy-MM-dd");qDebug("Current date= %s",str.toLocal8Bit().data());qDebug("Year= %d",  DT2.year());qDebug("Month= %d", DT2.month());qDebug("Day= %d",   DT2.day());qDebug("Day of week= %d", DT2.dayOfWeek());  //1表示星期一,7表示星期天
}
​
​
void Widget::on_btnDebugDateTime_clicked()
{QDateTime  DT1= QDateTime::currentDateTime();    //系统当前日期时间QString str= DT1.toString("yyyy-MM-dd hh:mm:ss");qDebug("DT1= %s",str.toLocal8Bit().data());
​QDate dt= DT1.date();    //日期部分str= dt.toString("yyyy-MM-dd");qDebug("DT1.date()= %s",str.toLocal8Bit().data());
​QTime tm= DT1.time();    //时间部分str=tm.toString("hh:mm:ss zzz");qDebug("DT1.time()= %s",str.toLocal8Bit().data());
​qint64 MS= DT1.toSecsSinceEpoch();   //转换为秒数qDebug("DT1.toSecsSinceEpoch()= %lld",MS);
}
#ifndef WIDGET_H
#define WIDGET_H
​
#include <QWidget>
​
​
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
​
​
class Widget : public QWidget
{Q_OBJECT
​
public:Widget(QWidget *parent = nullptr);~Widget();
​
private slots:
​void on_btnGetTime_clicked();
​void on_btnSetTime_clicked();
​void on_btnSetDate_clicked();
​void on_btnSetDateTime_clicked();
​void on_calendarWidget_selectionChanged();
​void on_btnDebugTime_clicked();
​void on_btnDebugDate_clicked();
​void on_btnDebugDateTime_clicked();
​
private:Ui::Widget *ui;
};
​
#endif // WIDGET_H
​

UI文件一栏:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/57617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL-06-入门篇-集合运算

文章目录 1. UNION 组合多个查询的结果集简介带有 ORDER BY 子句的 UNION设置样例表PostgreSQL UNION 示例1) 简单的 PostgreSQL UNION 示例2) PostgreSQL UNION ALL 示例3) 带 ORDER BY 子句 UNION ALL 示例 2. INTERSECT 取交集简介带 ORDER BY 子句的 INTERSECT 操作Postgre…

露营投影仪什么牌子好,中科极光A5 Pro Max开启投影新未来

伴随着现代学业工作繁重&#xff0c;人们的时间变得碎片化&#xff0c;对生活轻量化的需求也越来越高。便捷性、便利性、简易性开始成为人们的关注重点。而在简化、便捷的背后&#xff0c;品质是否能跟上成为了商品需要接受的考验。打造一间属于自己的私人小影厅&#xff0c;听…

当我们在微服务中使用API网关时,它是否会成为系统的瓶颈?这种潜在的瓶颈如何评估和解决?如何在微服务架构中保证高效请求流量?|API网关|微服务|异步处理

目录 1. API网关在微服务中的角色与重要性 2. API网关瓶颈的评估 2.1 请求延迟分析 2.2 并发请求量监控 2.3 内存和CPU使用情况 2.4 限流和熔断机制评估 2.5 日志分析 3. API网关瓶颈的解决方案 3.1 缓存机制优化 3.2 负载均衡优化 3.3 异步处理与消息队列 3.4 限流…

【python ASR】win11-从0到1使用funasr实现本地离线音频转文本

文章目录 前言一、前提条件安装环境Python 安装安装依赖,使用工业预训练模型最后安装 - torch1. 安装前查看显卡支持的最高CUDA的版本&#xff0c;以便下载torch 对应的版本的安装包。torch 中的CUDA版本要低于显卡最高的CUDA版本。2. 前往网站下载[Pytorch](https://pytorch.o…

mysql8.0.32升级到8.0.40

上篇8.0.32库的准备&#xff1a;mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No suc-CSDN博客 此篇测试升级到8.0.40 MySQL :: Download MySQL Community Server rootjyc:~# mysql -u root -pabcd1234 mysql: [Warning]…

从此告别图床失效:一个几乎可以代理所有图床的工具!

原项目 Github: https://github.com/webp-sh/webp_server_go 根据此项目制作的脚本工具 一键脚本&#xff1a; curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/webp-server.sh && chmod x webp-server.sh && ./webp-server.sh是的&…

JavaScript语法基础——变量,数据类型,运算符和程序控制语句(小白友好篇,手把手教你学会!)

一、JavaScript概述 JavaScript是一种高级编程语言&#xff0c;常用于网页开发和服务器端应用程序。它是一种动态类型语言&#xff0c;可以在浏览器中直接解释执行&#xff0c;而不需要编译。 脚本&#xff08;Script&#xff09;是一种与计算机程序相关的指令集或代码块&…

Jenkins-配置使用ssh拉取仓库代码,配置自动化构建打包(三)(云效)

文章目录 准备注意&#xff1a;流程&#xff1a; 检查之前是否配置过与代码仓库的连接生成密钥对手动在服务器中与代码仓库建立连接以生成 Known hosts file代码仓库端添加公钥Jenkins System-Publish over SSH中添加私钥Jenkins中创建项目&#xff0c;并使用私钥添加ssh凭据构…

镭眸ILS-F13测量型激光雷达:超远距激光雷达专家

镭眸F13是一款超远距离测量型激光雷达&#xff0c;专为需要在超远距离内实现移动物体轮廓数据测量的用户设计。它能够以25Hz的扫描频率&#xff0c;在120米内提供3厘米的扫描精度&#xff0c;解决了现有传感器无法满足的测量距离问题。与市场上其他产品如西克&#xff08;SICK&…

windows安装deepin双系统

最近入手了一台中柏N100的小主机&#xff0c;本来只想当个机顶盒&#xff0c;没想到性能还可以&#xff0c;就打算用它做一些日常的办公&#xff0c;无聊时想着能不能再装个Linux&#xff0c;就去Deepin官网查看了下方法&#xff0c; 在此记录 另外&#xff0c;欢迎来我的博客…

SAP-FICO 月结流程

一、财务月结 1、资产会计-固定资产折旧计提AFAB 正式运行之前&#xff0c;先测试运行&#xff0c;没有问题就正式运行 可以看到&#xff0c;没有错误 因为正式系统的资产会过于庞大&#xff0c;一般都是后台运行资产的折旧 点击程序--后台执行 AFBP查看运行日志&#xff0c…

深度学习(八) TensorFlow、PyTorch、Keras框架大比拼(8/10)

一、深度学习框架概述 深度学习框架在当今人工智能和机器学习领域中占据着至关重要的地位。其中&#xff0c;TensorFlow 由 Google 开发&#xff0c;自 2015 年发布以来&#xff0c;凭借其灵活的计算图、自动微分功能以及跨平台支持等特点&#xff0c;迅速成为主流深度学习框架…

JVM—类加载器、双亲委派机制

目录 什么是类加载器 类加载器的分类 Bootstrap启动类加载器 通过启动类加载器加载用户jar包 Extension扩展类加载器和Application应用程序类加载器 通过扩展类加载器加载用户jar包 双亲委派机制 打破双亲委派机制 自定义类加载器 线程上下文类加载器 Osgi框架的类加…

flask第一个应用

文章目录 安装一、编程第一步二、引入配置三、代码解析 安装 python环境安装的过程就不重复赘述了&#xff0c;flask安装使用命令pip install Flask即可&#xff0c;使用命令pip show Flask查看flask版本信息 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供…

享元模式-实现大颗粒度对象缓存机制

详解 享元模式是一种结构型设计模式&#xff0c;其主要目的是通过共享尽可能多的相同部分来有效地支持大量细粒度的对象。它通过将对象的属性分为内在属性&#xff08;可以共享、不随环境变化的部分&#xff09;和外在属性&#xff08;根据场景变化、不能共享的部分&#xff0…

Flutter学习笔记(一)-----环境配置

一、android 环境 android这边可以参照godot的配置 1.装java Java Downloads | Oracle x64 Compressed Archive &#xff1a;下载后直接解压到某个位置&#xff0c;不用安装 x64 installer: 下载后双击安装 注意&#xff1a;不要去百度直接搜Java安装&#xff0c;这样你最多安…

JetBrains Clion Idea 等缓存文件和配置文件迁移

JetBrains 缓存文件和配置文件迁移 文件默认路径 缓存文件默认路径&#xff1a; %userprofile%/AppData/Local/JetBrains/应用名 如 C:/Users/wbl/AppData/Local/JetBrains/CLion2021.3日志文件默认路径&#xff1a;默认在配置文件目录下的log文件夹 %userprofile%/AppData…

《AI产品经理手册》——解锁AI时代的商业密钥

在当今这个日新月异的AI时代&#xff0c;每一位产品经理都面临着前所未有的挑战与机遇&#xff0c;唯有紧跟时代潮流&#xff0c;深入掌握AI技术的精髓&#xff0c;才能在激烈的市场竞争中独占鳌头。《AI产品经理手册》正是这样一部为AI产品经理量身定制的实战宝典&#xff0c;…

2024年最全2024年最系统的网络安全自学路线,学完即可就业_安全学习路线(2),2024年最新你掌握了多少

一个人可以走的很快&#xff0c;但一群人才能走的更远&#xff01;不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人&#xff0c;都欢迎加入我们的的圈子&#xff08;技术交流、学习资源、职场吐槽、大厂内推、面试辅导&#xff09;&#xff0c;让我们一起学习成长&#xf…

前端拖拽库方案之react-beautiful-dnd

近期&#xff0c;知名 React 拖拽库 react-beautiful-dnd 宣布了项目弃用的决定&#xff0c;未来将不再维护。这一决定源于其存在的缺陷与局限性&#xff0c;促使作者转向开发一个更加现代化的拖拽解决方案——Pragmatic drag and drop&#xff08;下面会介绍&#xff09;&…