日期时间类控件主要是对日期、时间等信息进行编辑、选择或者显示,在PyQt5中提供了Date/TimeEdit、DateEdit、TimeEdit和CalendarWidget等4个相关的控件,本节将对它们的常用方法和使用方式进行讲解。
1 日期和时间控件
PyQt5中提供了3个日期时间控件,分别是Date/TimeEdit控件、DateEdit控件和TimeEdit控件,其中,Date/TimeEdit控件对应的类是QDateTimeEdit,该控件可以同时显示和编辑日期时间;DateEdit控件对应的类是QDateEdit,它是QDateTimeEdit的子类,只能显示和编辑日期;TimeEdit控件对应的类是QTimeEdit,它是QDateTimeEdit的子类,只能显示和编辑时间。
QDateTimeEdit类的常用方法及说明如表所示。
| 方 法 | 说 明 |
|---|---|
| setTime() | 设置时间,默认为0:00:00 |
| setMaximumTime() | 设置最大时间,默认为23:59:59 |
| setMinimumTime() | 设置最小时间,默认为0:00:00 |
| setTimeSpec() | 获取显示的时间标准,支持以下4种取值: ◆ LocalTime:本地时间 ◆ UTC:世界标准时间 ◆ OffsetFromUTC:与UTC等效的时间 ◆ TimeZone:时区 |
| setDateTime() | 设置日期时间,默认为2000/1/1 0:00:00 |
| setDate() | 设置日期,默认为2000/1/1 |
| setMaximumDate() | 设置最大日期,默认为9999/12/31 |
| setMinimumDate() | 设置最小日期,默认为1752/9/14 |
| setDisplayFormat() | 设置日期时间显示样式,常见形式如下: ◆ 日期样式(yyyy表示4位数年份;MM表示2位数月份,dd表示2位数日): ■ yyyy/MM/dd ■ yyyy/M/d ■ yy/MM/dd ■ yy/M/d ■ yy/MM ■ Mm/dd ◆ 时间样式(HH表示2位数小时;mm表示2位数分钟,ss表示2位数秒钟): ■ HH:mm:ss ■ HH:mm ■ mm:ss ■ H:m ■ m:s |
| date() | 获取显示的日期,返回值为QDate类型,例如QDate(2000,1,1) |
| time() | 获取显示的时间,返回值为QTime类型,例如QTime(0,0) |
| dateTime() | 获取显示的日期时间,返回值为QDateTime类型,例如QDateTime(2000, 1, 1, 0, 0) |
Info: 说明 由于
QDateEdit和QTimeEdit类都是从QDateTimeEdit类继承而来的,因此它们都拥有QDateTimeEdit类的所有公共方法。
QDateTimeEdit类的常用信号及说明如表所示。
| 信 号 | 说 明 |
|---|---|
| timeChanged | 时间发生改变时发射 |
| dateChanged | 日期发生改变时发射 |
| dateTimeChanged | 日期或者时间发生改变时发射 |
例如,在Qt Designer设计器的窗口中分别添加一个Date/TimeEdit控件、一个DateEdit控件和一个TimeEdit控件,它们的显示效果如图所示。

Tip: 多学两招 1)由于
date()、time()和dateTime()方法的返回值分别是QDate类型、QTime类型和QDateTime类型,无法直接使用,因此如果想要获取日期时间控件中的具体日期和(或)时间值,可以使用text()方法进行获取,例如:
self.dateTimeEdit.text()
2)使用日期时间控件时,如果要改变日期时间,默认只能通过上下箭头来改变,如果想弹出日历控件,那么设置setCalendarPoput(True)即可。
2 CalendarWidget:日历控件
CalendarWidget控件,又称为日历控件,主要用来显示和选择日期。
CalendarWidget控件对应PyQt5中的QCalendarWidget类,该类的常用方法及说明如表所示。
| 方 法 | 说 明 |
|---|---|
| setSelectedDate() | 设置选中的日期,默认为当前日期 |
| setMinimumDate() | 设置最小日期,默认为1752/9/14 |
| setMaximumDate | 设置最大日期,默认为9999/12/31 |
| setFirstDayOfWeek | 设置一周的第一天,取值如下: ◆ Qt.Monday:星期一 ◆ Qt.Tuesday:星期二 ◆ Qt.Wednesday:星期三 ◆ Qt.Thursday:星期四 ◆ Qt.Friday:星期五 ◆ Qt.Saturday:星期六 ◆ Qt.Sunday:星期日 |
| setGridVisible | 设置是否显示网格线 |
| setSelectionMode | 设置选择模式,取值如下: ◆ QCalendarWidget.NoSelection:不能选中日期 ◆ QCalendarWidget.SingleSelection:可以选中一个日期 |
| setHorizontalHeaderFormat | 设置水平头部格式,分别如下: ◆ QCalendarWidget.NoHorizontalHeader:不显示水平头部 ◆ QCalendarWidget.SingleLetterDayNames:“周” ◆ QCalendarWidget.ShortDayNames:简短天的名称,如“周一” ◆ QCalendarWidget.LongDayNames:完整天的名称,如“星期一” |
| setVerticalHeaderFormat | 设置对齐方式,有水平和垂直两种,分别如下: ◆ QCalendarWidget.NoVerticalHeader:不显示垂直头部 ◆ QCalendarWidget.ISOWeekNumbers:以星期数字显示垂直头部 |
| setNavigationBarVisible | 设置是否显示导航栏 |
| setDateEditEnabled | 设置是否可以编辑日期 |
| setDateEditAcceptDelay() | 设置编辑日期的最长间隔,默认为1500 |
| selectedDate() | 获取选择的日期,返回值而QDate类型 |
CalendarWidget控件最常用的信号是selectionChanged,该信号在选择的日期发生改变时发射。
实例 获取选中的日期
在Qt Designer设计器中创建一个窗口,在窗口中添加一个CalendarWidget控件,设计完成后保存为.ui文件,并使用Pyuic工具将其转换为.py代码文件。在.py代码文件中自定义一个getdate()方法,用来获取CalendarWidget控件中选中的日期,并转换为年-月-日形式,显示在弹出的提示框中,代码如下:
def getdate(self):
from PyQt5.QtWidgets import QMessageBox
# 获取当前选中日期的QDate对象
date = QtCore.QDate(self.calendarWidget.selectedDate())
year = date.year() # 获取年份
month = date.month() # 获取月份
day = date.day() # 获取日
QMessageBox.information(MainWindow, "提示", str(year) + "-" + str(month) + "-" + str(day), QMessageBox.Ok)
对CalendarWidget控件进行设置,并为其selectionChanged信号绑定自定义的getdate()槽函数,代码如下:
self.calendarWidget = QtWidgets.QCalendarWidget(self.centralwidget)
self.calendarWidget.setGeometry(QtCore.QRect(20, 10, 248, 197))
self.calendarWidget.setSelectedDate(QtCore.QDate(2020, 3, 23)) # 设置默认选中的日期
self.calendarWidget.setMinimumDate(QtCore.QDate(1752, 9, 14)) # 设置最小的日期
self.calendarWidget.setMaximumDate(QtCore.QDate(9999, 12, 31)) # 设置最大的日期
self.calendarWidget.setFirstDayOfWeek(QtCore.Qt.Monday) # 设置每周的第一天为星期一
self.calendarWidget.setGridVisible(True) # 设置网格线可见
# 设置可以选中单个日期
self.calendarWidget.setSelectionMode(QtWidgets.QCalendarWidget.SingleSelection)
# 设置水平表头为简短形式,即“周一”形式
self.calendarWidget.setHorizontalHeaderFormat(QtWidgets.QCalendarWidget.ShortDayNames)
# 设置垂直表头为周数
self.calendarWidget.setVerticalHeaderFormat(QtWidgets.QCalendarWidget.ISOWeekNumbers)
self.calendarWidget.setNavigationBarVisible(True) # 设置显示导航栏
self.calendarWidget.setDateEditEnabled(True) # 设置日期可以编辑
self.calendarWidget.setObjectName("calendarWidget")
# 选中日期变化时显示选择的日期
self.calendarWidget.selectionChanged.connect(self.getdate)
为.py文件添加程序入口,然后运行程序,日期控件在窗口中的显示效果如图所示;

单击某个日期时,可以弹出对话框进行显示,如图所示。

Tip: 多学两招 在PyQt5中,如果要获取当前系统的日期时间,可以借助
QtCore模块下的QDateTime类、QDate类或者QTime类实现。其中,获取当前系统的日期时间可以使用QDateTime类的currentDateTime()方法,获取当前系统的日期可以使用QDate类的currentDate()方法,获取当前系统的时间可以使用QTime类的currentTime()方法,代码如下:# 获取当前系统的日期时间 datetime = QtCore.QDateTime.currentDateTime() # 获取当前系统的日期 date = QtCore.QDate.currentDate() # 获取当前系统的时间 time = QtCore.QTime.currentTime()