QCalendarWidget 日历控件
-
描述
- 提供了一个基于每月日历控件,允许用户选择一个日期
- 图示
-
-
继承自:QWidget
-
功能作用
- 构造函数
QCalendarWidget(parent: QWidget = None)
- 日期范围
setMinimumDate(QDate date) # 通过QDate对象设置最小日期 minimumDate() -> QDate # 获取最小日期,返回QDate对象 setMaximumDate(QDate date) # 通过QDate对象设置最大日期 maximumDate() -> QDate # 获取最大日期,返回QDate对象 setDateRange(QDate min, QDate max) # 通过QDate对象设置日期范围
- 日期编辑
- 当控件获取焦点时, 直接输入数字, 可以快速修改日期
setDateEditEnabled(bool enable) # 设置日历控件是否可以通过键盘编辑 isDateEditEnabled() -> bool # 判断日历控件是否可以被编辑 setDateEditAcceptDelay(int delay) # 设置通过键盘编辑后控件的响应时间(毫秒) dateEditAcceptDelay() -> int # 获取通过键盘编辑后控件的响应时间(毫秒)
- 日期获取
- 显示日期 并不等于 选中日期
monthShown() -> int # 获取当前显示的月,返回int类型数据 yearShown() -> int # 获取当前显示的年,返回int类型数据 selectedDate() -> QDate # 获取被选中的日期,返回QDate对象
- 格式外观
- 导航条
setNavigationBarVisible(bool) # 设置是否显示顶部导航条(顶部操作年、月的工具栏) isNavigationBarVisible() -> bool # 判断是否显示顶部导航条
- 一周的第一天
setFirstDayOfWeek(Qt.DayOfWeek dayOfWeek) # 设置控件每周的第一天为星期几 firstDayOfWeek() -> Qt.DayOfWeek # 获取控件每周的第一天是星期几 # 参数:Qt.DayOfWeek # Qt.Sunday # 星期日 # Qt.Monday # 星期一 # Qt.Tuesday # 星期二 # Qt.Wednesday # 星期三 # Qt.Thursday # 星期四 # Qt.Friday # 星期五 # Qt.Saturday # 星期六
- 网格显示
setGridVisible(bool) # 设置控件是否显示网格 isGridVisible() -> bool # 判断控件是否显示网格
- 文本格式
setHeaderTextFormat(QTextCharFormat format) # 通过QTextCharFormat对象设置水平头和垂直头字体格式 headerTextFormat() -> QTextCharFormat # 获取水平头和垂直头字体格式,返回QTextCharFormat对象 setHorizontalHeaderFormat(QCalendarWidget.HorizontalHeaderFormat format) # 设置水平头显示格式 horizontalHeaderFormat() -> QCalendarWidget.HorizontalHeaderFormat # 获取水平头显示格式 # 参数:QCalendarWidget.HorizontalHeaderFormat # QCalendarWidget.SingleLetterDayNames # 英文:M/中文:周 # QCalendarWidget.ShortDayNames # 英文:Mon/中文:周一 # QCalendarWidget.LongDayNames # 英文:Monday/中文:星期一 # QCalendarWidget.NoHorizontalHeader # 水平头部显示 setVerticalHeaderFormat(QCalendarWidget.VerticalHeaderFormat format) # 设置垂直头显示格式 verticalHeaderFormat() -> QCalendarWidget.VerticalHeaderFormat # 获取垂直头显示格式 # 参数:QCalendarWidget.VerticalHeaderFormat # QCalendarWidget.ISOWeekNumbers # 标题显示ISO周数(一年的第几周),如QDate.weekNumber()所述。 # QCalendarWidget.NoVerticalHeader # 垂直头部显示 setWeekdayTextFormat(self, Qt.DayOfWeek, QTextCharFormat) # 设置每周的某一天(星期几)字体显示格式 weekdayTextFormat(Qt.DayOfWeek dayOfWeek) -> QTextCharFormat # 获取每周的某一天(星期几)字体显示格式 setDateTextFormat(QDate date, QTextCharFormat format) # 设置指定某一天的字体显示格式 dateTextFormat(self, Union[QDate, datetime.date]) -> QTextCharFormat # 获取指定某一天的字体显示格式 dateTextFormat(self) -> object
- 导航条
- 日期选中
setSelectedDate(QDate date) # 设置选中指定日期 setSelectionMode(QCalendarWidget.SelectionMode mode) # # 设置控件日期能否被选中(不能限制代码设置) selectionMode() -> QCalendarWidget.SelectionMode # 获取选中模式 # 参数:QCalendarWidget.SelectionMode # QCalendarWidget.NoSelection # 日期无法被选中 # QCalendarWidget.SingleSelection # 日期可以被选中(单个日期)
- 常用的方法
showToday() # 展示当前这一天(今天),不会选中该日期 showSelectedDate() # 展示选中的日期 showNextYear() # 展示下一年份 showPreviousYear() # 展示上一年份 showNextMonth() # 展示下一月份 showPreviousMonth() # 展示上一月份 setCurrentPage(int year, int month) # 通过年和月设置展示页
- 构造函数
-
可用信号
activated(QDate date) # 只要用户按下Return或Enter键或双击日历小部件中的日期,就会发出此信号。 clicked(QDate date) # 鼠标单击有效日期时才会发出信号(无法选中日期为无效日期,不会发射该信号) currentPageChanged(int year, int month) # 当前展示页发生改变时会发出此信号。新的一年和一个月作为参数传递。 selectionChanged() # 当前选择的日期发生改变时会发出此信号(鼠标/代码)
- 代码示例
- 示例1:QCalendarWidget-功能作用
from PyQt5.Qt import * import sys class Windows(QWidget): def __init__(self): super().__init__() self.setWindowTitle('QCalendarWidget-功能作用') self.resize(500, 500) self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): cdw = QCalendarWidget(self) cdw.resize(300, 250) pass # 设置日期范围 # cdw.setMinimumDate(QDate(2000,1,1)) # 设置最小日期 # cdw.setMaximumDate(QDate(2099,12,31)) # 设置最大日期 # cdw.setDateRange(QDate(2020,1,1),QDate(2023,12,31)) # 设置一个日期范围 pass # 日期编辑 # cdw.setDateEditEnabled(False) # 设置日历控件不能被编辑(键盘操作) # cdw.setDateEditAcceptDelay(1000) # 设置通过键盘编辑后控件的响应时间(毫秒) pass # 日期获取 # 显示日期 并不等于 选中日期 print(cdw.monthShown()) # 获取当前显示月,返回Int类型数据 print(cdw.yearShown()) # 获取当前显示年,返回Int类型数据 print(cdw.selectedDate()) # 获取选中的日期,返回QDate对象 pass # 外观设置 # cdw.setNavigationBarVisible(False) # 设置是否显示头部导航栏(年、月操作工具栏) cdw.setFirstDayOfWeek(Qt.Sunday) # 设置控件的第一天是星期几 cdw.setGridVisible(True) # 设置是否显示网格 tcf = QTextCharFormat() tcf.setFontFamily('汉仪超级战甲W') tcf.setFontPointSize(14) # cdw.setHeaderTextFormat(tcf) # 通过QTextCharFormat对象设置水平头和垂直头字体格式 # cdw.setHorizontalHeaderFormat(QCalendarWidget.LongDayNames) # 设置水平头显示格式 # cdw.setVerticalHeaderFormat(QCalendarWidget.ISOWeekNumbers) # 设置垂直头显示格式 # cdw.setWeekdayTextFormat(Qt.Wednesday, tcf) # 设置每周的某一天(星期几)字体显示格式 # cdw.setDateTextFormat(QDate(2023,4,1), tcf) # 设置指定某一天的字体显示格式 # 结合自定某天设置字体格式和显示页发生改变时发射信号,可以做出日程提示 # cdw.setDateTextFormat(QDate(cdw.yearShown(), cdw.monthShown(), 22), tcf) # def select_m(year, month): # cdw.setDateTextFormat(QDate(year,month, 22), tcf) # # cdw.currentPageChanged.connect(select_m) pass # 日期选中设置 # cdw.setSelectedDate(QDate(2023,4,6)) # 设置选中某一天 # cdw.setSelectionMode(QCalendarWidget.NoSelection) # 设置控件日期能否被选中(不能限制代码设置) pass # 常用功能,显示页设置 def to_page_today(): cdw.showToday() cdw.setFocus() def to_page_nextyear(): cdw.showNextYear() cdw.setFocus() def to_page_previousyear(): cdw.showPreviousYear() cdw.setFocus() def to_page_nextmonth(): cdw.showNextMonth() cdw.setFocus() def to_page_previousmonth(): cdw.showPreviousMonth() cdw.setFocus() def to_page_currentpage(): cdw.setCurrentPage(2025,1) cdw.setFocus() btn1 = QPushButton('今天', self) btn1.move(cdw.width() + 10, 20) btn2 = QPushButton('下一年', self) btn2.move(btn1.x(),btn1.y()+30) btn3 = QPushButton('上一年', self) btn3.move(btn1.x(), btn2.y() + 30) btn4 = QPushButton('下一月', self) btn4.move(btn1.x(),btn3.y()+30) btn5 = QPushButton('上一月', self) btn5.move(btn1.x(), btn4.y() + 30) btn6 = QPushButton('跳转到...', self) btn6.move(btn1.x(), btn5.y() + 30) btn1.clicked.connect(to_page_today) btn2.clicked.connect(to_page_nextyear) btn3.clicked.connect(to_page_previousyear) btn4.clicked.connect(to_page_nextmonth) btn5.clicked.connect(to_page_previousmonth) btn6.clicked.connect(to_page_currentpage) if __name__ == '__main__': app = QApplication(sys.argv) window = Windows() window.show() sys.exit(app.exec_())
- 示例2:QCalendarWidget-可用信号
from PyQt5.Qt import * import sys class Windows(QWidget): def __init__(self): super().__init__() self.setWindowTitle('QCalendarWidget-可用信号') self.resize(500, 500) self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): cdw = QCalendarWidget(self) # activated(QDate date) # 只要用户按下Return或Enter键或双击日历小部件中的日期,就会发出此信号。 # clicked(QDate date) # 鼠标单击有效日期时才会发出信号(无法选中日期为无效日期,不会发射该信号) # currentPageChanged(int year, int month) # 当前展示页发生改变时会发出此信号。新的一年和一个月作为参数传递。 # selectionChanged() # 当前选择的日期发生改变时会发出此信号(鼠标/代码) # cdw.setSelectionMode(QCalendarWidget.NoSelection) cdw.activated.connect(lambda date:print('选中了日期:',date)) cdw.clicked.connect(lambda date: print('点击了:', date)) cdw.currentPageChanged.connect(lambda year,month: print(f'当前显示是{year}年{month}月')) cdw.selectionChanged.connect(lambda :print('当前选择的日期发生了改变')) cdw.setSelectedDate(QDate(2023,4,1)) if __name__ == '__main__': app = QApplication(sys.argv) window = Windows() window.show() sys.exit(app.exec_())