12. 日历控件

一、日历类

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

  我们可以在终端中使用 pip 安装 pyside6 模块。

pip install pyside6

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

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

  其中,name 可以取值如下:

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

  system 是 QCalendar.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                                                                     # 显示当前日期的日历

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

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

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

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

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

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

  用 setFirstDayOfWeek(Qt.DayOfWeek) 方法可以设置一周中哪天排在最前面,其中参数 Qt.DayOfWeek 可以取Qt.Monday ~ Qt.Sunday。

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

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

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QCalendarWidget
from PySide6.QtCore import QDate
from PySide6.QtGui import Qt

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

    def setup_ui(self):
        # 1.设置窗口对象大小
        self.resize(700, 500)

        # 2.创建日历控件
        calendarWidget = QCalendarWidget(self)
        calendarWidget.resize(400, 400)

        # 3.设置最小日期
        calendarWidget.setMinimumDate(QDate(2000, 1, 1))

        # 4.设置最大日期
        calendarWidget.setMaximumDate(QDate(2999, 12, 31))

        # 5.设置一周的第一天
        calendarWidget.setFirstDayOfWeek(Qt.DayOfWeek.Sunday)

        # 6.设置是否显示网格
        calendarWidget.setGridVisible(True)

        # 7.设置选择模式
        calendarWidget.setSelectionMode(QCalendarWidget.SelectionMode.SingleSelection)

        # 8.设置水平头部模式
        calendarWidget.setHorizontalHeaderFormat(QCalendarWidget.HorizontalHeaderFormat.LongDayNames)

        # 9.设置对齐方式
        calendarWidget.setVerticalHeaderFormat(QCalendarWidget.VerticalHeaderFormat.NoVerticalHeader)

        # 10.设置是否显示导航栏
        calendarWidget.setNavigationBarVisible(True)

        # 11.设置是否可以编辑日期
        calendarWidget.setDateEditEnabled(True)

        # 12.设置编辑日期的最大间隔
        calendarWidget.setDateEditAcceptDelay(30)

        # 13.获取选中的日期
        print(calendarWidget.selectedDate())

        # 14.定义信号与槽的连接
        calendarWidget.clicked.connect(self.clicked)
        calendarWidget.activated.connect(self.activated)
        calendarWidget.selectionChanged.connect(self.selectionChanged)
        calendarWidget.currentPageChanged.connect(self.currentPageChanged)

    def clicked(self, date):
        print("你选中的日期为:", date)

    def activated(self, date):
        print("你激活的日期为:", date)

    def selectionChanged(self):
        print("选中的日期发生改变了,")

    def currentPageChanged(self, year, money):
        print(f"你选中的日期在为【{year}】-【{money}】月")

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)
    # 2.创建一个窗口
    window = MyWidget()
    # 3.展示窗口
    window.show()
    # 4.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())
posted @   星光映梦  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示