11. 日期和时间控件

一、日期和时间控件

  日期和时间类也是 PySide6 中的基本类,利用它们可以设置纪年法、记录某个日期时间点、对日期时间进行计算等。用户输入日期时间及显示日期时间时需要用到日期时间控件,本节介绍有关日期时间的类及相关控件。

  我们可以在终端中使用 pip 安装 pyside6 模块。

pip install pyside6

日期和时间控件

二、时间类

  时间类 QTime 用小时、分钟、秒和毫秒来记录某个时间点,它采用 24 小时制,没有 AM/PM 和时区概念。它可以对时间进行操作,例如增加或减少毫秒、秒,进行时间与字符串的相互转换等。

  用 QTime 类创建实例对象的方法如下。

QTime()
QTime(h:int, m:int, s:int, ms:int=0)

  QTime 的常用方法如下:

# 实例方法
setHMS(h:int, m:int, s:int, ms:int=0) -> bool                           # 设置时间,若设置有问题,返回False

addMSecs(ms:int) -> QTime                                               # 返回增加毫秒后的时间,参数可以为负
addSecs(secs:int) -> QTime                                              # 返回增加秒后的时间,参数可以为负

hour() -> int                                                           # 返回小时数
minute() -> int                                                         # 返回分钟数
second() -> int                                                         # 返回秒数
msec() -> int                                                           # 返回毫秒数
msecsSinceStartOfDay() -> int                                           # 返回从0到系统当前时间所经过的毫米数

msecsTo(t:QTime) -> int                                                 # 获取当前系统时间与给定时间的毫秒间隔
secsTo(t:QTime) -> int                                                  # 获取当前系统时间与给定时间的秒间隔

isNull() -> bool                                                        # 获取是否有记录的时间
isValid() -> bool                                                       # 获取记录的时间是否是有效的

toString(f:Qt.DateFormat=Qt.TextDate) -> str                            # 将时间转换成字符串
toString(format:str) -> str                                             # 将时间转换成字符串

# 静态方法
currentTime() -> QTime                                                  # 获取当前的系统时间
fromMSecsSinceStartOfDay(msecs:int) -> QTime                            # 返回从0时刻到指定毫秒数的时间
fromString(string:str, format:Qt.DateFormat=Qt.TextDate]) -> QTime      # 将字符串转换成时间
fromString(string:str, format:str) -> QTime                             # 将字符串转换成时间
isValid(h:int, m:int, s:int, ms:int=0]) -> bool                         # 获取给定的时间是否有效

  用 fromString(str,format:Qt.DateFormat=Qt.TextDate)fromString(str,format:str) 方法可以将时间字符串转换成日期,用 toString(f:Qt.DateFormat=Qt.TextDate)toString(format:str) 方法可以按照格式将时间转换成字符串,其中 format 是格式字符串,可以取的格式符号如下所示。

时间格式字符 说明
h 小时用 0 ~ 23,或 1 ~ 12(如果显示 am/pm)
hh 小时用 00 ~ 23,或 01 ~ 12(如果显示 am/pm)
H 小时用 0 ~ 23 表示(不论是否显示 am/pm)
HH 小时用 00 ~ 23 表示(不论是否显示 am/pm)
m 分钟用 0~ 59 表示(不补 0)
mm 分钟用 00~ 59 表示(补 0)
s 秒用 0~ 59 表示(不补 0)
ss 秒用 00~ 59 表示(补 0)
z 毫秒用 0~ 999 表示(不补 0)
zzz 毫秒用 000~ 999 表示(补 0)
t 时区
ap 或 a 使用 am/pm 表示上午/下午或汉字
AP 或 A 使用 AM/PM 表示上午/下午或汉字

三、日期类

  日期类 QDate 用年、月、日来记录某天。它可以从系统时钟中读取当前日期。QDate 提供了操作日期的方法,例如添加和减去日期、月份和年份得到新的日期,与日期字符串相互转换等。QDate 在PySide6.QtCore模块中。

  用 QDate 类创建实例对象的方法如下。

QDate()
QDate(y:int, m:int, d:int)
QDate(y:int, m:int, d:int, cal:QCalendar)

  QDate 的常用方法如下:

# 实例方法
setDate(year:int, month:int, day:int) -> bool                               # 根据年月日设置日期
setDate(year:int, month:int, day:int, cal:QCalendar) -> bool                # 根据年月日设置日期
getDate() -> tuple[int, int, int]                                           # 获取记录的年月日

day() -> int                                                                # 获取记录的日期
day(cal:QCalendar) -> int                                                   # 根据指定日历获取日期
month() -> int                                                              # 获取记录的月份
month(cal:QCalendar) -> int                                                 # 根据指定日历获取月份
year() -> int                                                               # 获取记录的年份
year(cal:QCalendar) -> int                                                  # 根据指定日历获取年份

addDays(days:int) -> QDate                                                  # 返回增加指定天后的日期,参数可以为负
addMonths(months:int) -> QDate                                              # 返回增加指定月后的日期,参数可以为负
addMonths(months:int, cal:QCalendar) -> QDate                               # 返回增加指定月后的日期,参数可以为负
addYears(years:int) -> QDate                                                # 返回增加指定年后的日期,参数可以为负
addYears(years:int, cal:QCalendar) -> QDate                                 # 返回增加指定年后的日期,参数可以为负

dayOfWeek() -> int                                                          # 获取记录的日期是一周的第几天
dayOfWeek(cal:QCalendar) -> int                                             # 根据指定日历获取日期是一周的第几天
dayOfYear() -> int                                                          # 获取记录的日期是一年的第几天
dayOfYear(cal:QCalendar) -> int                                             # 根据指定日历获取日期是一年的第几天

daysInMonth() -> int                                                        # 获取日期所在月的月天数
daysInMonth(cal:QCalendar) -> int                                           # 根据指定日历获取日期所在月的月天数
daysInYear() -> int                                                         # 获取日期所在年的年天数
daysInYear(cal:QCalendar) -> int                                            # 根据指定日历获取日期所在年的年天数

weekNumber() -> tuple[int, int]                                             # 获取记录的日期是一年的第几周,返回的元组第一个参数是周数,第二个参数是年

daysTo(d:QDate) -> int                                                      # 获取记录的日期到指定日期的天数
isNull() -> bool                                                            # 获取是否不包含日期数据
toJulianDay() -> int                                                        # 换算成Julian Day
toString(format:Qt.DateFormat=Qt.TextDate) -> str                           # 将年月日按照特定格式转换成字符串
toString (format:str, cal=QCalendar()) -> str                               # 将年月日按照特定格式转换成字符串

# 静态方法
currentDate() -> QDate                                                      # 获取当前日期
fromJulianDay(jd_:int) -> QDate                                             # 将Julian Day换成日期
fromString(string:str, format:Qt.DateFormat=Qt.TextDate) -> QDate           # 将字符串转换成日期
fromString(string:str, format:str, cal:QCalendar=QCalendar()) -> QDate      # 将字符串转换成日期
isLeapYear(year:int) -> bool                                                # 判断是否是闰年
isValid(y:int, m:int, d:int) -> bool                                        # 判断是否是有效的日期

  用 fromString(string:str,format:Qt.DateFormat=Qt.TextDate)fromString(string:str,format:str) 方法可以将字符串型的日期数据转换成 QDate,也可用 toString(format:Qt.DateFormat=Qt.TextDate)toString(format:str) 方法将记录的年、月、日转换成字符串,其中 Qt.DateFormat 是枚举类型常量。用 Qt.DateFormat 进行指定格式的转换时与操作系统有关。format 是格式化文本,可以取的格式符号如下所示。

日期格式符 说明
d 天数用 1 到 31 表示(不补 0)
dd 天数用 01 到 31 表示(补 0)
ddd 天数用英文简写表示("Mon" ~ "Sun")或汉字表示
dddd 天数用英文全写表示("Monday" ~ "Sunday")或汉字表示
M 月数用 1 到 12 表示(不补 0)
MM 月数用 01 到 12 表示(补 0)
MMM 月数用英文简写表示("Jan" ~ "Dec")或汉字表示
MMMM 月数用英文简写表示("January" ~ "December")或汉字表示
yy 年数用 00 ~ 99 表示
yyyy 年数用 4 位数表示

四、日期时间类

  日期时间类 QDateTime 是将 QDate 和 QTime 的功能合并到一个类中,用年、月、日、时、分、秒、毫秒记录某个日期和某个时间点,它有时区的概念。

  用 QDateTime 创建日期时间实例的方法如下所示。

QDateTime()
QDateTime(arg_1:int, arg_2:int, arg_3:int, arg_4:int, arg_5:int, arg_6:int)
QDateTime(arg_1:int, arg_2:int, arg_3:int, arg_4:int, arg_5:int, arg_6:int, arg_7:int, arg_8:int=Qt.LocalTime)
QDateTime(data:QDate, time:QTime, spec:Qt.TimeSpec=Qt.LocalTime, offsetSeconds:int=0)

  其中 Qt.TimeSpec 可以取 Qt.TimeSpec.LocalTimeQt.TimeSpec.UTCQt.TimeSpec.OffsetFromUTCQt.TimeSpec.TimeZone,对应的值分别是 0 ~ 3;当 spec 取 Qt.TimeSpec.OffsetFromUTC 时,offsetSeconds 才有意义。

  日期时间类的常用方法如下:

# 实例方法
setDate(date:QDate) -> None                                                                 # 设置日期
setTime(time:QTime) -> None                                                                 # 设置时间
date() -> QDate                                                                             # 获取日期
time() -> QTime                                                                             # 获取时间

setTimeSpec(spec:Qt.TimeSpec) -> None                                                       # 设置时间格式
setSecsSinceEpoch(secs:int) -> None                                                         # 将日期设置从1970年1月1日0时0分0秒开始的时间
setMSecsSinceEpoch(msecs:int) -> None                                                       # 将日期设置从1970年1月1日0时0分0秒开始的时间
setOffsetFromUtc(offsetSeconds:int) -> None

addMSecs(msecs:int) -> QDateTime                                                            # 增加毫秒,返回新的QDateTime
addSecs(secs:int) -> QDateTime                                                              # 增加秒,返回新的的QDateTime
addDays(days:int) -> QDateTime                                                              # 增加天,返回新的的QDateTime
addMonths(months:int) -> QDateTime                                                          # 增加月,返回新的的QDateTime
addYears(years:int) -> QDateTime                                                            # 增加年,返回新的的QDateTime

msecsTo(arg__1:QDateTime) -> int                                                            # 两个时间之间的毫秒数
secsTo(arg__1:QDateTime) -> int                                                             # 两个时间之间的秒数
daysTo(arg__1:QDateTime) -> int                                                             # 两个时间之间的天数

toString(format:str, cal:QCalendar=QCalendar()) -> str                                      # 根据格式将日期时间转换为字符串
toString(format:Qt.DateFormat) -> str                                                       # 根据格式将日期时间转换为字符串
toUTC() -> QDateTime                                                                        # 将日期时间转换为国际统一时间
toLocalTime() -> QDateTime                                                                  # 将日期时间转换为本地时间
toTimeSpec(spec:Qt.TimeSpec) -> QDateTime                                                   # 将日期时间转换为指定的计时时间
toMSecsSinceEpoch() -> int                                                                  # 返回从1970年1月1日0时0分0秒计时的毫秒数
toSecsSinceEpoch() -> int                                                                   # 返回从1970年1月1日0时0分0秒计时的秒数

isNull() -> bool                                                                            # 所记录的时间是否为空
isValid() -> bool                                                                           # 所记录的时间是否有效

# 静态方法
currentDateTime() -> QDateTime                                                              # 获取当前日期时间
currentDateTimeUtc() -> QDateTime                                                           # 获取当前世界统一日期时间
currentMSecsSinceEpoch() -> int                                                             # 返回从1970年1月1日0时0分0秒到现在为止的毫秒数
currentSecsSinceEpoch() -> int                                                              # 返回从1970年1月1日0时0分0秒到现在为止的秒数
fromString(string:str, format:Qt.DateFormat=Qt.TextDate) -> QDateTime                       # 根据格式将字符串转换为日期时间
fromString(string:str, format:str, cal:QCalendar=QCalendar()) -> QDateTime                  # 根据格式将字符串转换为日期时间
fromMSecsSinceEpoch(msecs:int, spec:Qt.TimeSpec, offsetFromUtc:int=0) -> QDateTime          # 根据毫秒数和时间格式将毫秒数转换为日期时间
fromSecsSinceEpoch(secs:int, spec:Qt.TimeSpec, offsetFromUtc:int=0) -> QDateTime            # 根据秒数和时间格式将秒数转换为日期时间

五、日期时间控件

  日期时间控件包括 QDateTimeEditQDateEditQTimeEdit 三个控件。这三个控件可以显示日期时间,但更多的是用于输入日期时间。QDateTimeEdit 可以输入日期和时间,QDateEdit 只能输入日期,QTimeEdit 只能输入时间。QDateTimeEdit 是有下拉列表的日历控件,用于选择日期。QDateTimeEdit 是从 QAbstractSpinBox 类继承而来的,而 QDateEdit 和 QTimeEdit 都是从 QDateTimeEdit 类继承而来的。

  用 QDateTimeEdit、QDateEdit、QTimeEdit 类创建实例对象的方法如下。

QDateTimeEdit(parent:QWidget=None)
QDateTimeEdit(dt:QDateTime, parent:QWidget=None)
QDateTimeEdit(d:QDate, parent:QWidget=None)
QDateTimeEdit(t:QTime, parent:QWidget=None)

QDateEdit(parent:QWidget=None)
QDateEdit(d:QDate, parent:QWidget=None)

QTimeEdit(parent:QWidget=None)
QTimeEdit(t:QTime, parent:QWidget=None)

  其中 parent窗口 或者 容器类控件

  QDateTimeEdit 类的常用方法如下:

# 实例方法
time() -> QTime                                                 # 获取时间
date() -> QDate                                                 # 获取日期
dateTime() -> QDateTime                                         # 获取日期时间

setMinimumTime(min:QTime) -> None                               # 设置最小时间
setMaximumTime(max:QTime) -> None                               # 设置最大时间
setTimeRange(min:QTime, max:QTime) -> None                      # 设置时间范围
setMinimumDate(min:QDate) -> None                               # 设置最小日期
setMaximumDate(max:QDate) -> None                               # 设置最大日期
setDateRange(min:QDate, max:QDate) -> None                      # 设置日期范围
setMinimumDateTime(min:QDateTime) -> None                       # 设置最小日期时间
setMaximumDateTime(max:QDateTime) -> None                       # 设置最大日期时间
setDateTimeRange(min:QDateTime, max:QDateTime) -> None          # 设置日期时间范围

clearMinimumTime() -> None                                      # 清除最小时间
clearMaximumTime() -> None                                      # 清除最大时间
clearMinimumDate() -> None                                      # 清除最小日期
clearMaximumDate() -> None                                      # 清除最大日期
clearMinimumDateTime() -> None                                  # 清除最小日期时间
clearMaximumDateTime() -> None                                  # 清除最大日期时间

setCalendar(calendar:QCalendarWidget) -> None                   # 设置日历
setCalendarPopup(enable:bool) -> None                           # 设置是否有日历控件
calendarPopup() -> bool                                         # 获取是否有日历控件
setCalendarWidget(calendarWidget:QCalendarWidget) -> None       # 设置日历控件

setDisplayFormat(format:str) -> None                            # 设置显示格式
displayFormat() -> str                                          # 获取显示格式

dateTimeFromText(text:str) -> QDateTime                         # 将字符串转换为日期时间对象
textFromDateTime(dt:QDateTime) -> str                           # 将日期时间对象转换为字符串

setSelectedSection(section:QDateTimeEdit.Section) -> None       # 设置被选中的部分
sectionText(section:QDateTimeEdit.Section) -> str               # 获取被选中的部分文本
sectionCount() -> int                                           # 获取总共分为几部分
setTimeSpec(spec:Qt.TimeSpec) -> None                           # 设置时间计时参考点

# 槽函数
setTime(time:QTime) -> None                                     # 设置时间
setDate(date:QDate) -> None                                     # 设置日期
setDateTime(dateTime:QDateTime) -> None                         # 设置日期时间

  日期时间控件的输入部分被分割成年、月、日、时、分、秒多个部分,用 setSelectedSection(QDateTimeEdit.Section)

QDateTimeEdit.Section.NoSection
QDateTimeEdit.Section.AmPmSection
QDateTimeEdit.Section.MSecSection
QDateTimeEdit.Section.SecondSection
QDateTimeEdit.Section.MinuteSection
QDateTimeEdit.Section.HourSection
QDateTimeEdit.Section.DaySection
QDateTimeEdit.Section.MonthSection
QDateTimeEdit.Section.YearSection

  QDateTime 类的常用信号及其说明如下:

timeChanged(time:QTime)                 # 时间发生改变时发射
dateChanged(date:QDate)                 # 日期发生改变时发射
dateTimeChanged(dateTime:QDateTime)     # 日期或者时间发生改变时发射
editingFinished()                       # 编辑完成后发射信号
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QTimeEdit, QDateEdit, QDateTimeEdit
from PySide6.QtCore import QTime, QDate, QDateTime
from PySide6.QtGui import Qt

class MyWidget(QWidget):
    def __init__(self):
        # 1.调用父类Qwidget类的__init__()方法
        super().__init__()
        # 2.调用setupUi()方法初始化页面
        self.setup_ui()

    def setup_ui(self):
        # 1.设置窗口对象大小
        self.resize(700, 500)

        # 2.创建日期和时间控件
        dateTimeEdit = QDateTimeEdit(self)
        dateTimeEdit.setGeometry(0, 0, 150, 20)

        dateEdit = QDateEdit(self)
        dateEdit.setGeometry(0, 50, 150, 20)

        timeEdit = QTimeEdit(self)
        timeEdit.setGeometry(0, 100, 150, 20)

        # 3.设置时间标准
        dateTimeEdit.setTimeSpec(Qt.TimeSpec.LocalTime)
        dateEdit.setTimeSpec(Qt.TimeSpec.UTC)

        # 4.设置显示模式
        dateTimeEdit.setDisplayFormat("yyyy-MM-dd hh:mm:ss")
        dateEdit.setDisplayFormat("yyyy/M/d")
        timeEdit.setDisplayFormat("h:m:s")

        # 5.设置最小的日期和时间
        dateTimeEdit.setMinimumDateTime(QDateTime(2000, 1, 1, 0, 0, 0))
        dateEdit.setMinimumDate(QDate(2000, 1, 1))
        timeEdit.setMinimumTime(QTime(0, 0, 0))

        # 7.设置最大的日期和时间
        dateTimeEdit.setMaximumDateTime(QDateTime(2999, 12, 31, 23, 59, 59))
        dateEdit.setMaximumDate(QDate(2999, 12, 31))
        timeEdit.setMaximumTime(QTime(23, 59, 59))

        # 8.设置日期和时间
        dateTimeEdit.setDateTime(QDateTime(2020, 12, 24, 20, 30, 30))
        dateEdit.setDate(QDate(2020, 12, 24))
        timeEdit.setTime(QTime(20, 30, 30))

        # 8.使用日期控件
        dateTimeEdit.setCalendarPopup(True)
        dateEdit.setCalendarPopup(True)

        # 9.获取日期和时间
        print(dateTimeEdit.dateTime())
        print(dateEdit.date())
        print(timeEdit.time())

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 2.创建一个窗口
    window = MyWidget()
    # 3.展示窗口
    window.show()
    # 4.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

由于 QDateEdit 和 QTimeEdit 类都是从 QDateTimeEdit 类继承而来的,因此它们都拥有 QDateTimeEdit 类的所有公共方法;

由于 date()、time()、dateTime() 方法的返回值分别是 QDate 类型、QTime 类型、QDateTime 类型,无法直接使用,因此如果想要获取日期时间控件中的具体日期或时间值,可以使用 text() 方法进行获取;

使用日期时间控件时,如果想要改变日期时间,默认只能通过上下箭头来改变,如果想要弹出日历控件,那么设置 setCalendarPopup(True);

posted @   星光映梦  阅读(111)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示