今天學習的是最後一個展示控件——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() #選中的日期發生變化,無參數
點選觸發和選擇觸發有個差別,點選觸發隻有滑鼠點選時候觸發,而選中觸發可以通過代碼選中或鍵盤輸入。