PyQt5-日期时间类和界面组件

日期时间是经常遇到的数据类型,PyQt5中日期时间相关的类有以下几个。

image

image

image

其中->· QDateEdit:编辑和显示日期的组件。若calendarPopup属性设置为True,运行时右侧按钮变成下拉按钮,单击按钮时出现一个日历选择框,用于在日历上选择日期。

设置前:

image

设置后:

image

下面是我设计的窗口界面:

image

下面是窗体业务逻辑类QmyWidget的完整代码,代码涉及的内容在后面各小节逐一解释。

import sys
from PyQt5.QtWidgets import  QWidget,QApplication
from PyQt5.QtCore import QDate,QDateTime,QTime

from ui_QtApp import Ui_Form
class QmyWidget(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent) #调用父类构造函数
        self.ui=Ui_Form() #创建UI对象
        self.ui.setupUi(self) #构造UI

    ## ====由connectSlotsByName()自动与组件的信号关联的槽函数=====
    def on_pushButton_clicked(self): #读取当前日期时间
        curDateTime=QDateTime.currentDateTime()
        self.ui.timeEdit.setTime(curDateTime.time())
        self.ui.lineEdit.setText(curDateTime.toString("hh:mm:ss"))
        self.ui.dateEdit.setDate(curDateTime.date())
        self.ui.lineEdit_2.setText(curDateTime.toString("yyyy-MM-dd"))
        self.ui.dateTimeEdit.setDateTime(curDateTime)
        self.ui.lineEdit_3.setText(curDateTime.toString("yyyy-MM-dd hh:mm:ss"))

    def on_calendarWidget_selectionChanged(self): #日历组件
        date=self.ui.calendarWidget.selectedDate()
        self.ui.lineEdit_4.setText(date.toString("yyyy年M月d日"))

    def on_pushButton_2_clicked(self):   #设置时间按钮
        tmStr=self.ui.lineEdit.text()
        tm=QTime.fromString(tmStr,"hh:mm:ss")
        self.ui.timeEdit.setTime(tm)

    def on_pushButton_3_clicked(self):   #设置日期按钮
        dtStr=self.ui.lineEdit_2.text()
        dt=QDate.fromString(dtStr,"yyyy-MM-dd")
        self.ui.dateEdit.setDate(dt)

    def on_pushButton_4_clicked(self):   #设置日期时间按钮
        dttmStr=self.ui.lineEdit_3.text()
        dttm=QDateTime.fromString(dttmStr,"yyyy-MM-dd hh:mm:ss")
        self.ui.dateTimeEdit.setDateTime(dttm)

    ## =======自定义槽函数=======


if __name__ == "__main__": ##用于当前窗体测试
    app=QApplication(sys.argv) #创建GUI应用程序
    form=QmyWidget() #创建窗体
    form.show()
    sys.exit(app.exec_())

应用程序主程序appMain.py文件如下:

## GUI应用程序主程序
import sys
from PyQt5.QtWidgets import  QApplication
from myWidget import  QmyWidget

app = QApplication(sys.argv) # 创建app,用QApplication类
myWidget = QmyWidget() #创建窗体
myWidget.show()
sys.exit(app.exec_())

最终效果如下:

image

日期时间数据的获取并转换为字符串

界面上的“读取当前日期时间”按钮用于获取当前日期时间并转换为字符串显示,其槽函数是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是用于日期时间显示的常用格式符。

image

在设置日期时间显示字符串格式时,还可以使用填字符,甚至使用汉字,例如,日期显示格式可以设置为:

image

字符串转换为日期时间

同样,也可以将字符串转换为QTime、QDate或QDateTime类型,这三个类都有类函数fromString(),且参数形式相同,例如QDateTime.fromString()函数原型为:

image

注意,类函数没有self参数。第1个参数dateTimeStr是日期时间字符串,第2个参数formatStr是字符串表示的格式,按照表3-3的格式字符定义。例如:

image

QLineEdit的inputMask

在将字符串转换为日期时间数据时,需要字符串具有指定的格式,例如图3-5上的“设置日期”按钮的槽函数代码是:

image

其中的dtStr是读取的界面上一个QLineEdit组件里的字符串,这个字符串需要符合日期格式“yyyy-MM-dd”,如果不符合这个格式,转换就会出错。

为了限定QLineEdit的输入符合某些格式,可以设置其inputMask属性。在设计图3-5的窗体时,为3个显示时间、日期、日期时间的QLineEdit组件设置了inputMask属性。inputMask属性的设置内容及其意义如表3-4所示,在没有输入任何数据时,其显示如图3-6所示。

image

这样用inputMask属性对输入格式做了限制后,可以避免一些无效的输入。inputMask属性设置还有很多具体的格式定义,在此就不照搬帮助文件进行介绍了,需要用到时去查Qt的帮助文件即可。

posted @ 2022-05-09 10:52  司砚章  阅读(1169)  评论(0编辑  收藏  举报