3.4 日期时间数据
3.4.1 日期时间类和界面组件
日期时间是经常遇到的数据类型,PyQt5中日期时间相关的类有以下几个。
· QTime:时间数据类型,仅表示时间,如15:21:13。
· QDate:日期数据类型,仅表示日期,如2018-5-6。
· QDateTime:日期时间数据类型,表示日期和时间,如2018-05-23 09:12:43。
PyQt5中有以下几个专门用于日期、时间编辑和显示的界面组件。
· QTimeEdit:编辑和显示时间的组件。
· QDateEdit:编辑和显示日期的组件。若calendarPopup属性设置为True,运行时右侧按钮变成下拉按钮,单击按钮时出现一个日历选择框,用于在日历上选择日期。
· QDateTimeEdit:编辑和显示日期时间的组件,也有calendarPopup属性。
· QCalendarWidget:一个用日历形式选择日期的组件。在日历上点击日期发生变化时发射信号selectionChanged(),可响应此信号读取选择的日期。
示例Demo3_4用于演示这些日期时间相关的类和界面组件的使用,运行时界面如图3-5所示。窗体UI文件Widget.ui在UI Designer里可视化设计,界面上的组件布局和属性设置见示例源文件Widget.ui。
图3-5 示例Demo3_4运行时界面
下面是窗体业务逻辑类QmyWidget的完整代码,代码涉及的内容在后面各小节逐一解释。
import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtCore import QDateTime, QDate, QTime from ui_Widget import Ui_Widget class QmyWidget(QWidget): def __init__(self, parent=None): super().__init__(parent) #调用父类构造函数,创建窗体 self.ui=Ui_Widget() #创建UI对象 self.ui.setupUi(self) #构造UI ## ======由connectSlotsByName() 自动关联的槽函数==================== def on_btnGetTime_clicked(self): ##"读取当前日期时间"按钮 curDateTime=QDateTime.currentDateTime() self.ui.timeEdit.setTime(curDateTime.time()) self.ui.editTime.setText(curDateTime.toString("hh:mm:ss")) self.ui.dateEdit.setDate(curDateTime.date()) self.ui.editDate.setText(curDateTime.toString("yyyy-MM-dd")) self.ui.dateTimeEdit.setDateTime(curDateTime) self.ui.editDateTime.setText( curDateTime.toString("yyyy-MM-dd hh:mm:ss")) def on_calendarWidget_selectionChanged(self): ##日历组件 date=self.ui.calendarWidget.selectedDate() self.ui.editCalendar.setText(date.toString("yyyy年M月d日")) def on_btnSetTime_clicked(self): ##"设置时间"按钮 tmStr=self.ui.editTime.text() tm=QTime.fromString(tmStr, "hh:mm:ss") self.ui.timeEdit.setTime(tm) def on_btnSetDate_clicked(self): ##"设置日期"按钮 dtStr=self.ui.editDate.text() dt=QDate.fromString(dtStr, "yyyy-MM-dd") self.ui.dateEdit.setDate(dt) def on_btnSetDateTime_clicked(self): ##"设置日期时间"按钮 dttmStr=self.ui.editDateTime.text() dttm=QDateTime.fromString(dttmStr, "yyyy-MM-dd hh:mm:ss") self.ui.dateTimeEdit.setDateTime(dttm)
3.4.2 日期时间数据的获取并转换为字符串
界面上的“读取当前日期时间”按钮用于获取当前日期时间并转换为字符串显示,其槽函数是on_btnGetTime_clicked()。
代码中用QDateTime的类函数(也就是C++中类的静态函数)currentDateTime()获取当前日期时间,并赋值给变量curDateTime。然后用curDateTime变量设置界面上3个日期时间编辑器的日期或时间值,利用了QDateTime的date()和time()函数分别提取日期和时间。
其实,QTime和QDate类也有各自的类函数分别获取当前时间和日期,类函数QTime. currentTime()返回当前时间,类函数QDate.currentDate()返回当前日期。
日期时间转换为字符串使用了QDateTime的toString()函数,分别用不同的格式显示时间、日期、日期时间。QDateTime、QTime、QDate都有函数toString(),它们的函数参数是相同的,且遵循相同的格式规则。例如QDateTime的toString()函数的Python函数原型是:
toString(self, formatStr) -> str
它将日期时间数据按照formatStr指定的格式转换为字符串。formatStr是一个字符串,包含一些特定的字符表示日期或时间的各个部分,表3-3是用于日期时间显示的常用格式符。
表3-3 用于日期显示的格式符及其意义
在设置日期时间显示字符串格式时,还可以使用填字符,甚至使用汉字,例如,日期显示格式可以设置为:
curDateTime.toString("yyyy年MM月dd日")
3.4.3 字符串转换为日期时间
同样,也可以将字符串转换为QTime、QDate或QDateTime类型,这三个类都有类函数fromString(),且参数形式相同,例如QDateTime.fromString()函数原型为:
fromString(dateTimeStr, formatStr) -> QDateTime
注意,类函数没有self参数。第1个参数dateTimeStr是日期时间字符串,第2个参数formatStr是字符串表示的格式,按照表3-3的格式字符定义。例如:
dttm=QDateTime.fromString("2018-02-12 12:32:02", "yyyy-MM-dd hh:mm:ss")
3.4.4 QLineEdit的inputMask
在将字符串转换为日期时间数据时,需要字符串具有指定的格式,例如图3-5上的“设置日期”按钮的槽函数代码是:
def on_btnSetDate_clicked(self): ##"设置日期"按钮 dtStr=self.ui.editDate.text() dt=QDate.fromString(dtStr, "yyyy-MM-dd") self.ui.dateEdit.setDate(dt)
其中的dtStr是读取的界面上一个QLineEdit组件里的字符串,这个字符串需要符合日期格式“yyyy-MM-dd”,如果不符合这个格式,转换就会出错。
为了限定QLineEdit的输入符合某些格式,可以设置其inputMask属性。在设计图3-5的窗体时,为3个显示时间、日期、日期时间的QLineEdit组件设置了inputMask属性。inputMask属性的设置内容及其意义如表3-4所示,在没有输入任何数据时,其显示如图3-6所示。
表3-4 窗体上3个QLineEdit组件的inputMask属性设置及其意义
图3-6 设置了inputMask属性的QLineEdit组件
这样用inputMask属性对输入格式做了限制后,可以避免一些无效的输入。inputMask属性设置还有很多具体的格式定义,在此就不照搬帮助文件进行介绍了,需要用到时去查Qt的帮助文件即可。