PyQt5-日期时间类和界面组件
日期时间是经常遇到的数据类型,PyQt5中日期时间相关的类有以下几个。
其中->· QDateEdit:编辑和显示日期的组件。若calendarPopup属性设置为True,运行时右侧按钮变成下拉按钮,单击按钮时出现一个日历选择框,用于在日历上选择日期。
设置前:
设置后:
下面是我设计的窗口界面:
下面是窗体业务逻辑类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_())
最终效果如下:
日期时间数据的获取并转换为字符串
界面上的“读取当前日期时间”按钮用于获取当前日期时间并转换为字符串显示,其槽函数是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是用于日期时间显示的常用格式符。
在设置日期时间显示字符串格式时,还可以使用填字符,甚至使用汉字,例如,日期显示格式可以设置为:
字符串转换为日期时间
同样,也可以将字符串转换为QTime、QDate或QDateTime类型,这三个类都有类函数fromString(),且参数形式相同,例如QDateTime.fromString()函数原型为:
注意,类函数没有self参数。第1个参数dateTimeStr是日期时间字符串,第2个参数formatStr是字符串表示的格式,按照表3-3的格式字符定义。例如:
QLineEdit的inputMask
在将字符串转换为日期时间数据时,需要字符串具有指定的格式,例如图3-5上的“设置日期”按钮的槽函数代码是:
其中的dtStr是读取的界面上一个QLineEdit组件里的字符串,这个字符串需要符合日期格式“yyyy-MM-dd”,如果不符合这个格式,转换就会出错。
为了限定QLineEdit的输入符合某些格式,可以设置其inputMask属性。在设计图3-5的窗体时,为3个显示时间、日期、日期时间的QLineEdit组件设置了inputMask属性。inputMask属性的设置内容及其意义如表3-4所示,在没有输入任何数据时,其显示如图3-6所示。
这样用inputMask属性对输入格式做了限制后,可以避免一些无效的输入。inputMask属性设置还有很多具体的格式定义,在此就不照搬帮助文件进行介绍了,需要用到时去查Qt的帮助文件即可。