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的幫助檔案即可。