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.LocalTime、Qt.TimeSpec.UTC、Qt.TimeSpec.OffsetFromUTC 或 Qt.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 # 根据秒数和时间格式将秒数转换为日期时间
五、日期时间控件
日期时间控件包括 QDateTimeEdit
、QDateEdit
和 QTimeEdit
三个控件。这三个控件可以显示日期时间,但更多的是用于输入日期时间。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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构