今天學習的是最后一個展示控件——QCalendarWidget
一.描述
QCalendarWidget提供了一個基於每月的日歷控件,允許用戶選擇一個日期,還可以看一下里面的圖示:
QCalendarWidget是基於QWidget的一個子類,不像前面所用的QDialog一樣具備彈出功能,所以要好多時候都需要結合QDialog使用。
二.功能作用
1.日期范圍
QCalendarWidget.setMaximumDate(self, date: typing.Union[QtCore.QDate, datetime.date])
QCalendarWidget.setMinimumDate(self, date: typing.Union[QtCore.QDate, datetime.date])
QCalendarWidget.setDateRange(self, min: typing.Union[QtCore.QDate, datetime.date], max: typing.Union[QtCore.QDate, datetime.date])
設定了范圍后,如果日期超出了范圍則相應日期會變灰。
2.日期編輯
日期是可以通過鼠標點擊來改變的,當然也可以通過鍵盤來實現
QCalendarWidget.setDateEditEnabled()
這個設置默認值為True,在控件上可以直接用鍵盤輸入,會有下面的效果
也就是可以用鍵盤輸入日期直接跳轉
在輸入的過程中我們還可以通過下面的代碼控制等待鍵盤輸入的時間
QCalendarWidget.setDateEditAcceptDelay(self, delay: int) #delay的值是ms
當然也可以獲取上面的值
QCalendarWidget.isDateEditEnabled() -> bool
QCalendarWidget.dateEditAcceptDelay() -> int
還可以設置當前的時間
self, date: typing.Union[QtCore.QDate, datetime.date]
我們可以通過一個按鈕把日期返回到當下。

from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.resize(500,300) self.UI_test() def UI_test(self): self.cw = QCalendarWidget(self) self.btn = QPushButton('test',self) self.btn.move(250,0) self.btn.clicked.connect(self.fun) def fun(self): date = QDate.currentDate() self.cw.setSelectedDate(date) pass if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
3.日期獲取
QCalendarWidget.monthShown()-> int QCalendarWidget.yearShown()-> int QCalendarWidget.selectedDate() -> QtCore.QDate
要注意的是選擇和展示的區別,選擇是光標所選擇的日期(選中后改變了年/月但是選中的日期是不會變的,變的只有展示的值)
4.格式外觀
a.導航條
QCalendarWidget.setNavigationBarVisible()
QCalendarWidget.isNavigationBarVisible()
b.設置一周的第一天
默認的第一天都是周一,但國外有些地方默認是周日,那么可以按照下面的方法來設定
QCalendarWidget.setFirstDayOfWeek(self, dayOfWeek: QtCore.Qt.DayOfWeek) Monday = ... # type: 'Qt.DayOfWeek' Tuesday = ... # type: 'Qt.DayOfWeek' Wednesday = ... # type: 'Qt.DayOfWeek' Thursday = ... # type: 'Qt.DayOfWeek' Friday = ... # type: 'Qt.DayOfWeek' Saturday = ... # type: 'Qt.DayOfWeek' Sunday = ... # type: 'Qt.DayOfWeek'
c.網格顯示
默認情況是日歷是不帶網格的,可以用網格把日期隔開
QCalendarWidget.setGridVisible()
QCalendarWidget.isGridVisible() -> bool
網格的效果是這樣的
d.文本格式
垂直頭、水平頭設置
QCalendarWidget.setHeaderTextFormat(self, format: QtGui.QTextCharFormat)
水平頭的格式
QCalendarWidget.setHorizontalHeaderFormat(self, format: 'QCalendarWidget.HorizontalHeaderFormat') # type: 'QCalendarWidget.HorizontalHeaderFormat' NoHorizontalHeader = ... # type: 'QCalendarWidget.HorizontalHeaderFormat' SingleLetterDayNames = ... # type: 'QCalendarWidget.HorizontalHeaderFormat' ShortDayNames = ... # type: 'QCalendarWidget.HorizontalHeaderFormat' LongDayNames = ... # type: 'QCalendarWidget.HorizontalHeaderFormat'
垂直頭格式
QCalendarWidget.setVerticalHeaderFormat(self, format: 'QCalendarWidget.VerticalHeaderFormat') # type: 'QCalendarWidget.VerticalHeaderFormat' NoVerticalHeader = ... # 隱藏 ISOWeekNumbers = ... # 顯示周數
修改星期字體和日期字體格式
QCalendarWidget.setDateTextFormat(self, date: typing.Union[QtCore.QDate, datetime.date], color: QtGui.QTextCharFormat) #可以修改指定的星期幾的字體 QCalendarWidget.setDateTextFormat(self, date: typing.Union[QtCore.QDate, datetime.date], color: QtGui.QTextCharFormat) #可以修改指定的date的字體
5.選中
QCalendarWidget.setSelectedDate(self, date: typing.Union[QtCore.QDate, datetime.date]) QCalendarWidget.setSelectionMode(self, mode: 'QCalendarWidget.SelectionMode') #日期選擇模式 # type: 'QCalendarWidget.SelectionMode' NoSelection = ... # 日期無法選擇 SingleSelection = ... # 只能單選
無法選擇主要用於為用戶展示日期,並且無法更改。
三.常用方法
QCalendarWidget.showToday() #展示當日,只負責展示當頁,不負責選中 QCalendarWidget.showSelectedDate() QCalendarWidget.showNextMonth() QCalendarWidget.showNextYear() QCalendarWidget.showPreviousMonth() QCalendarWidget.showPreviousYear() QCalendarWidget.setCurrentPage(self, year: int, month: int)
要注意的是show只是負責展示日、月或年的那一頁,而不附加選中的效果。
四.信號
QCalendarWidget.activated(self, date: typing.Union[QtCore.QDate, datetime.date]) #回車或雙擊時能觸發,參數為日期 QCalendarWidget.clicked(self, date: typing.Union[QtCore.QDate, datetime.date]) #點擊時觸發,參數為日期 QCalendarWidget.currentPageChanged(self, year: int, month: int) #當前頁面發生變化,參數為新的的頁面(年和月) QCalendarWidget.selectionChanged() #選中的日期發生變化,無參數
點擊觸發和選擇觸發有個區別,點擊觸發只有鼠標點擊時候觸發,而選中觸發可以通過代碼選中或鍵盤輸入。