日期时间类控件主要是对日期、时间等信息进行编辑、选择或者显示,在PyQt5中提供了Date/TimeEditDateEditTimeEditCalendarWidget等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: 说明 由于QDateEditQTimeEdit类都是从QDateTimeEdit类继承而来的,因此它们都拥有QDateTimeEdit类的所有公共方法。

QDateTimeEdit类的常用信号及说明如表所示。

信    号说    明
timeChanged时间发生改变时发射
dateChanged日期发生改变时发射
dateTimeChanged日期或者时间发生改变时发射

例如,在Qt Designer设计器的窗口中分别添加一个Date/TimeEdit控件、一个DateEdit控件和一个TimeEdit控件,它们的显示效果如图所示。

Pasted image 20250901201046

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文件添加程序入口,然后运行程序,日期控件在窗口中的显示效果如图所示;

Pasted image 20250901202415

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

Pasted image 20250901202613

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

# 获取当前系统的日期时间  
datetime = QtCore.QDateTime.currentDateTime()  
# 获取当前系统的日期  
date = QtCore.QDate.currentDate()  
# 获取当前系统的时间  
time = QtCore.QTime.currentTime()