13. 日历控件

一、日历类

  日历类 QCalendar 主要用于确定纪年法,当前通用的是公历纪年法,这也是默认值。QCalendar 类在 PySide6.QtCore 模块中。

  我们可以在终端中使用 pip 安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip 指令后通过 -i 指定国内镜像源下载

pip install pyside6 -i https://mirrors.aliyun.com/pypi/simple

  国内常用的 pip 下载源列表:

  用 QCalendar 类创建日历实例的方法如下:

QCalendar()
QCalendar(name:str)
QCalendar(system:QCalendar.System)

  其中,name 可以取值如下:

'Julian'
'Jalali'
'Islamic Civil'
'Milankovic'
'Gregorian'
'islamicc'
'Islamic'
'gregory'
'Persian'
'islamic-civil'

  systemQCalendar.System 类型的枚举值,可取值如下:

QCalendar.System.Gregorian                                                      # 默认值
QCalendar.System.Julian
QCalendar.System.Milankovic
QCalendar.System.Jalali
QCalendar.System.IslamicCivil

  日历类的常用方法如下:

# 实例方法
name() -> str                                                                   # 获取当前使用的日历纪年法

dateFromParts(year:int, month:int, day:int) -> datetime                         # 根据年月日创建日期

dayOfWeek(date:QDate) -> int                                                    # 获取指定日期在一周的第几天
daysInMonth(month:int, year:int=QCalendar.Unspecified) -> int                   # 获取指定年指定月份的总天数
daysInYear(year:int) -> int                                                     # 获取指定年份的总天数
isDateValid(year:int, month:int, day:int) -> bool                               # 检查指定年月日是否有效

isGregorian() -> bool                                                           # 检查是否是公历
isLeapYear(year) -> bool                                                        # 检查是否是闰年
isLunar() -> bool                                                               # 检查是否是农历
isSolar() -> bool                                                               # 检查是否是阳历

minimumDaysInMonth() -> int                                                     # 获取月中最小天数
maximumDaysInMonth() -> int                                                     # 获取月中最大天数
maximumMonthsInYear() -> int                                                    # 获取年中最大月数

# 静态方法
availableCalendars() -> List[str]                                               # 获取可用的日历纪年法

二、日历控件

  日历控件 QCalendarWidget 主要用于显示日期、星期和周数。可以设置日历控件显示的最小日期和最大日期,还可以设置日历表头的样式。

  用 QCalendarWidget 类创建实例对象的方法如下:

QCalendarWidget(parent:QWidget=None)

  其中 parent窗口 或者 容器类控件

  CalendarWidget 控件常用的方法及其说明如下:

# 实例方法
selectedDate() -> QDate                                                         # 获取选中的日期

setCalendar(calendar:QCalendar) -> None                                         # 设置日历
calendar() -> QCalendar                                                         # 获取日历

setDateTextFormat(date:QDate, format:QTextFormat) -> None                       # 设置日期的显示格式
dateTextFormat() -> QTextFormat                                                 # 获取日期的显示格式

setFirstDayOfWeek(dayOfWeek:Qt.DayOfWeek) -> None                               # 设置一周的第一天显示的是哪一天
firstDayOfWeek() -> Qt.DayOfWeek                                                # 获取一周的第一天显示的是哪一天

isGridVisible() -> bool                                                         # 是否显示日历网格
isNavigationBarVisible() -> bool                                                # 是否显示导航栏

setHorizontalHeaderFormat(format:QCalendarWidget.HorizontalHeaderFormat)  -> None   # 设置水平表头的格式
setVerticalHeaderFormat(format:QCalendarWidget.VerticalHeaderFormat) -> None        # 设置垂直表头的格式

setMinimumDate(date:QDate) -> None                                              # 设置日历控件可选的最小日期
minimumDate() -> QDate                                                          # 获取日历控件可选的最小日期
setMaximumDate(date:QDate) -> None                                              # 设置日历控件可选的最大日期
maximumDate() -> QDate                                                          # 获取日历控件可选的最大日期

setSelectionMode(mode:QCalendarWidget.SelectionMode) -> None                    # 设置选择模式

monthShown() -> int                                                             # 获取显示的月份
yearShown() -> int                                                              # 获取显示的年份

# 槽函数
setSelectedDate(date:QDate) -> None                                             # 设置选中的日期
setCurrentPage(year:int, month:int) -> None                                     # 设置当前显示的年和月

setGridVisible(show:bool) -> None                                               # 设置日历网格是否可见

setDateRange(min:QDate, max:QDate) -> None                                      # 设置日历控件可选的日期范围

setNavigationBarVisible(visible:bool) -> None                                   # 设置导航栏是否可见

showSelectedDate() -> None                                                      # 显示选中的日期
showPreviousMonth() -> None                                                     # 显示上一个月的日历
showNextMonth() -> None                                                         # 显示下一个月的日历
showPreviousYear() -> None                                                      # 显示上一年的日历
showNextYear() -> None                                                          # 显示下一年的日历
showToday() -> None                                                             # 显示当前日期的日历

  QCalendarWidget 控件常用的信号及其说明如下:

activated(date:QDate)                                                           # 日期激活(双击)时发射信号
clicked(date:QDate)                                                             # 日期被点击时发送信号
currentPageChanged(year:int, month:int)                                         # 月视图被切换时发射信号
selectionChanged()                                                              # 选择日期发生改变发射信号

  用 setSelectionMode(mode:QCalendarWidget.SelectionMode) 方法可以 设置选择日期的模式,其中参数 modeQCalendarWidget.SelectionMode 类型的枚举值,可以取值如下:

QCalendarWidget.SelectionMode.NoSelection                                       # 不允许选择
QCalendarWidget.SelectionMode.SingleSelection                                   # 单选

  用 setVerticalHeaderFormat(format:QCalendarWidget.VerticalHeaderFormat) 方法可以 设置竖直表头的格式,其中参数 formatQCalendarWidget.VerticalHeaderFormat 类型的枚举值,可以取值如下:

QCalendarWidget.VerticalHeaderFormat.ISOWeekNumbers                             # 标准格式的周数
QCalendarWidget.VerticalHeaderFormat.NoVerticalHeader                           # 隐藏周数

  用 setHorizontalHeaderFormat(format:QCalendarWidget.HorizontalHeaderFormat) 方法可以 设置水平表头的格式,其中参数 formatQCalendarWidget.HorizontalHeaderFormat 类型的枚举值,可以取值如下:

QCalendarWidget.HorizontalHeaderFormat.SingleLetterDayNames                     # 用单个字母代替全拼,如M代表Monday
QCalendarWidget.HorizontalHeaderFormat.ShortDayNames                            # 用缩写代替全拼,如Mon代表Monday
QCalendarWidget.HorizontalHeaderFormat.LongDayNames                             # 全名
QCalendarWidget.HorizontalHeaderFormat.NoHorizontalHeader                       # 隐藏表头

  用 setFirstDayOfWeek(day:Qt.DayOfWeek) 方法可以 设置一周中哪天排在最前面,其中参数 dayQt.DayOfWeek 类型的枚举值,可以取值如下:

Qt.DayOfWeek.Monday
Qt.DayOfWeek.Tuesday
Qt.DayOfWeek.Wednesday
Qt.DayOfWeek.Thursday
Qt.DayOfWeek.Friday
Qt.DayOfWeek.Saturday
Qt.DayOfWeek.Sunday

  我们新建一个 ui.py 文件,用来存放 UI 相关的代码。

from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QCalendarWidget, QLabel
from PySide6.QtWidgets import QVBoxLayout
from PySide6.QtCore import QDate, Qt

class MyUi:
    def setupUi(self, window:QWidget):
        window.resize(800, 600)                                                 # 1.设置窗口对象大小
  
        self.calendarWidget = QCalendarWidget(window)                           # 2.创建日历控件
        self.label = QLabel(window)                                             # 3.创建标签控件

        layout = QVBoxLayout(window)                                            # 4.创建垂直布局
        layout.addWidget(self.calendarWidget)                                   # 5.添加控件到布局中
        layout.addWidget(self.label)

        self.calendarWidget.setGridVisible(True)                                # 6.设置是否显示网格
        self.calendarWidget.setFirstDayOfWeek(Qt.DayOfWeek.Sunday)              # 7.设置一周的第一天
        self.calendarWidget.setDateEditEnabled(True)                            # 8.设置是否可以编辑日期快速跳转
  
        self.calendarWidget.setHorizontalHeaderFormat(QCalendarWidget.HorizontalHeaderFormat.LongDayNames)  # 9.设置水平头部模式
        self.calendarWidget.setVerticalHeaderFormat(QCalendarWidget.VerticalHeaderFormat.NoVerticalHeader)  # 10.设置对齐方式

        self.calendarWidget.setMinimumDate(QDate(2000, 1, 1))                   # 11.设置最小日期
        self.calendarWidget.setMaximumDate(QDate(2999, 12, 31))                 # 12.设置最大日期

        self.label.setText(self.calendarWidget.selectedDate().toString())       # 13.获取当前选中的日期并设置标签文本

  我们新建一个 widget.py 文件,用来存放业务逻辑相关的代码。

import sys

from PySide6.QtWidgets import QApplication, QWidget

from ui import MyUi

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()                                                      # 1.调用父类Qwidget类的__init__()方法
      
        self.__ui = MyUi()
        self.__ui.setupUi(self)                                                # 2.初始化页面

        self.__ui.calendarWidget.clicked.connect(self.clicked)                          # 3.关联日历的点击时触发信号
        self.__ui.calendarWidget.activated.connect(self.activated)                      # 4.关联日历的激活时触发信号
        self.__ui.calendarWidget.selectionChanged.connect(self.selectionChanged)        # 5.关联日历的选择时触发信号
        self.__ui.calendarWidget.currentPageChanged.connect(self.currentPageChanged)    # 6.关联日历页切换时触发信号

    def clicked(self, date):
        self.__ui.label.setText(f"你选中的日期为:{date}")

    def activated(self, date):
        self.__ui.label.setText(f"你激活的日期为:{date}")

    def selectionChanged(self):
        self.__ui.label.setText("选中的日期发生改变了")

    def currentPageChanged(self, year, money):
        self.__ui.label.setText(f"你目前正在浏览【{year}】年-【{money}】月")

if __name__ == "__main__":
    app = QApplication(sys.argv)                                                # 1.创建一个QApplication类的实例
    window = MyWidget()                                                         # 2.创建一个窗口
    window.show()                                                               # 3.显示窗口
    sys.exit(app.exec())                                                        # 4.进入程序的主循环,并通过exit函数确保主循环安全结束
posted @ 2025-01-01 18:45  星光映梦  阅读(233)  评论(0)    收藏  举报