14. 日期时间类控件

一、日期和时间控件

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

  我们可以在终端中使用 pip 安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip 指令后通过 -i 指定国内镜像源下载

pip install pyside6 -i https://mirrors.aliyun.com/pypi/simple

  国内常用的 pip 下载源列表:

日期时间类控件

二、时间类

  时间类 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(format:Qt.DateFormat=Qt.DateFormat.TextDate) -> str                    # 将时间转换成字符串
toString(format:str) -> str                                                     # 将时间转换成字符串

# 静态方法
currentTime() -> QTime                                                          # 获取当前的系统时间

fromMSecsSinceStartOfDay(msecs:int) -> QTime                                    # 返回从0时刻到指定毫秒数的时间

fromString(string:str, format:str) -> QTime                                     # 将字符串转换成时间
fromString(string:str, format:Qt.DateFormat=Qt.DateFormat.TextDate) -> QTime    # 将字符串转换成时间

isValid(h:int, m:int, s:int, ms:int=0) -> bool                                  # 获取给定的时间是否有效

  用 fromString(string:str, format:Qt.DateFormat=Qt.DateFormat.TextDate)fromString(string:str, format:str) 方法可以 时间字符串转换成日期,用 toString(format:Qt.DateFormat=Qt.DateFormat.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 提供了操作日期的方法,例如添加和减去日期、月份和年份得到新的日期,与日期字符串相互转换等。QDatePySide6.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.DateFormat.TextDate)fromString(string:str, format:str) 方法可以 将字符串型的日期数据转换成 QDate,也可用 toString(format:Qt.DateFormat=Qt.DateFormat.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 是将 QDateQTime 的功能合并到一个类中,用年、月、日、时、分、秒、毫秒记录某个日期和某个时间点,它有时区的概念。

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

QDateTime()
QDateTime(year:int, month:int, day:int, hour:int, minute:int, second:int)
QDateTime(year:int, month:int, day:int, hour:int, minute:int, second:int, millisecond:int, spec:int|Qt.TimeSpec=Qt.TimeSpec.LocalTime)
QDateTime(data:QDate, time:QTime, spec:Qt.TimeSpec=Qt.TimeSpec.LocalTime, offsetSeconds:int=0)

  其中,参数 specQt.TimeSpec 类型的枚举值,可以取值如下:

Qt.TimeSpec.LocalTime
Qt.TimeSpec.UTC
Qt.TimeSpec.OffsetFromUTC
Qt.TimeSpec.TimeZone

specQt.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 类继承而来的,而 QDateEditQTimeEdit 都是从 QDateTimeEdit 类继承而来的。

  用 QDateTimeEditQDateEditQTimeEdit 类创建实例对象的方法如下:

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                                         # 设置日期时间

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

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

  日期时间控件的输入部分被分割成年、月、日、时、分、秒多个部分,用 setSelectedSection(section:QDateTimeEdit.Section) 可以使 某个部分被选中,其中,参数 sectionQDateTimeEdit.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

  我们新建一个 ui.py 文件,用来存放 UI 相关的代码。

from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QDateTimeEdit, QDateEdit, QTimeEdit, QLabel
from PySide6.QtWidgets import QVBoxLayout
from PySide6.QtCore import Qt, QDateTime, QTime, QDate

class MyUi:
    def setupUi(self, window:QWidget):
        window.resize(260, 100)                                                 # 1.设置窗口对象大小

        layout = QVBoxLayout(window)                                            # 2.创建一个垂直布局
  
        self.dateTimeEdit = QDateTimeEdit(window)                               # 3.创建日期和时间控件,并添加到布局中
        layout.addWidget(self.dateTimeEdit)
  
        self.dateEdit = QDateEdit(window)                                       # 4.创建日期控件,并添加到布局中  
        layout.addWidget(self.dateEdit)

        self.timeEdit = QTimeEdit(window)                                       # 5.创建时间控件,并添加到布局中
        layout.addWidget(self.timeEdit)

        self.label = QLabel(window)                                             # 6.创建标签控件,并添加到布局中
        layout.addWidget(self.label)

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

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

        self.dateTimeEdit.setMinimumDateTime(QDateTime(2000, 1, 1, 0, 0, 0))    # 9.设置最小的日期和时间
        self.dateEdit.setMinimumDate(QDate(2000, 1, 1))
        self.timeEdit.setMinimumTime(QTime(0, 0, 0))
      
        self.dateTimeEdit.setMaximumDateTime(QDateTime(2999, 12, 31, 23, 59, 59))   # 10.设置最大的日期和时间
        self.dateEdit.setMaximumDate(QDate(2999, 12, 31))
        self.timeEdit.setMaximumTime(QTime(23, 59, 59))

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

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

        self.label.setText(self.dateTimeEdit.text())                            # 12.获取日期时间并设置标签文本

  我们新建一个 widget.py 文件,用来存放业务逻辑相关的代码。

import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtCore import QDateTime, QDate, QTime

from ui import MyUi

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

        self.__ui.dateTimeEdit.dateTimeChanged.connect(self.dateTimeEdit_date_time_changed) # 3.关联日期时间控件日期时间改变时触发信号
        self.__ui.dateEdit.dateChanged.connect(self.dateEdit_date_changed)      # 4.关联日期控件日期改变时触发信号
        self.__ui.timeEdit.timeChanged.connect(self.timeEdit_time_changed)      # 5.关联时间控件时间改变时触发信号

    def dateTimeEdit_date_time_changed(self, date_time:QDateTime):
        self.__ui.label.setText(date_time.toString("yyyy-MM-dd hh:mm:ss"))

    def dateEdit_date_changed(self, date:QDate):
        self.__ui.label.setText(date.toString("yyyy-MM-dd"))

    def timeEdit_time_changed(self, time:QTime):
        self.__ui.label.setText(time.toString("hh:mm:ss"))

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

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

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

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

posted @ 2025-01-02 21:02  星光映梦  阅读(134)  评论(0)    收藏  举报