Python Qt GUI与数据可视化编程
上QQ阅读APP看书,第一时间看更新

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的帮助文件即可。