PyQt5 - QWidgets部件进阶教程之日历窗口部件

本文介绍了如何使用PyQt5的QCalendarWidget创建一个日历窗口部件,详细讲解了部件的属性和功能,包括设置日历的最小、最大日期、颜色、标题格式等。同时展示了如何响应用户交互,同步更新部件状态。文章还讨论了遇到的问题和可能的改进方向。
摘要由CSDN通过智能技术生成

废话

QCalendarWidget显示一个日历月份,并允许用户选择日期。日历包括四个组件:一个允许用户更改月份的导航栏,一个每个单元代表每个月每天的网格,两个显示星期名和周数的抬头。
日历部件案例展示一个QCalendarWidget,并允许用户使用QComboBoxes、QCheckBoxes和QDateEdits进行外观和行为配置。另外,用户可以调整个人日期和抬头的格式。

QCalendarWidget 包含的属性:

属性 描述
selectedDate 当前选定的日期
minimumDate 最早可以选择的日期
maximumDate 最多可以选择的日期
firstDayOfWeek 显示每个星期的第一天
gridVisible 是否显示网格
selectionMode 用户能否选择日期
horizontalHeaderFormat 水平抬头的日期名称格式
verticalHeaderFormat 垂直抬头的格式
navigationBarVisible 是否显示日历部件顶部的导航

实现窗口类

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

import sys

class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()

        self.createPreviewGroupBox()
        self.createGeneralOptionGroupBox()
        self.createDatesGroupBox()
        self.createTextFormatsGroupBox()

        self.layout = QGridLayout()
        self.layout.addWidget(self.previewGroupBox, 0, 0)
        self.layout.addWidget(self.generalOptionGroupBox, 0, 1)
        self.layout.addWidget(self.datesGroupBox, 1, 0)
        self.layout.addWidget(self.textFormatsGroupBox, 1, 1)
        self.layout.setSizeConstraint(QLayout.SetFixedSize)
        self.setLayout(self.layout)

        self.previewLayout.setRowMinimumHeight(0, self.calendar.sizeHint().height())
        self.previewLayout.setColumnMinimumWidth(0, self.calendar.sizeHint().width())

        self.setWindowTitle('Calendar Widget')
  • 我们开始通过构造函数创建四个QGroupBoxes,然后将他们集合到QGridLayout。
  • 网格布局的resize规则设置为SetFixedSize,是为防止用户调整窗口大小。这个模式下,窗口的尺寸会根据内容的尺寸提示自动调整。
  • 为确保窗口不会因为更改一个窗口属性而每次自动调整,我们将第0行和第0列的最小高度设置为QCalendarWidget的初始尺寸。
    def createPreviewGroupBox(self):
        self.previewGroupBox = QGroupBox('PreView')

        self.calendar = QCalendarWidget()
        self.calendar.setMinimumDate(QDate(1900, 1, 1))
        self.calendar.setMaximumDate(QDate(3000, 1, 1))
        self.calendar.setGridVisible(True)

        self.calendar.currentPageChanged.connect(self.reformatCalendarPage)

        self.previewLayout = QGridLayout()
        self.previewLayout.addWidget(self.calendar, 0, 0, Qt.AlignCenter)
        self.previewGroupBox.setLayout(self.previewLayout)

previewGroupBox只包含一个部件 — QCalendarWidget。我们装载后,将他的currentPageChanged()信号连接到reformatCalendarPage(),来确保每个新页面会获得用户指定的格式。

    def createGeneralOptionGroupBox(self):
        self.generalOptionGroupBox = QGroupBox('General Options')

        self.localeCombo = QComboBox()
        curLocaleIndex = -1
        index = 0
        countries = []
        for i in range(QLocale.C, QLocale.LastLanguage+1):
            lang = QLocale(i)
            countries.append(lang.country())
            for j in range(len(countries)):
                country = countries[j]
                label = QLocale.languageToString(lang.language())
                label += '/'
                label += QLocale.countryToString(country)
                locale = QLocale(i, country)
                if self.locale().language() == lang and self.locale().country() == country:
                    curLocaleIndex = index
                self.localeCombo.addItem(label, locale)
                index += 1
        if curLocaleIndex != -1:
            self.localeCombo.setCurrentIndex(curLocaleIndex)
        localeLabel = QLabel('&Locale')
        localeLabel.setBuddy(self.localeCombo)

        self.firstDayCombo = QComboBox()
        self.firstDayCombo.addItem('Sunday', Qt.Sunday)
        self.firstDayCombo.addItem('Monday', Qt.Monday)
        self.firstDayCombo.addItem('Tuesday', Qt.Tuesday)
        self.firstDayCombo.addItem('Wendnesday', Qt.Wednesday)
        self.firstDayCombo.addItem('Thursday', Qt.Thursday)
        self.firstDayCombo.addItem('Friday', Qt.Friday)
        self.firstDayCombo.addItem('Saturday', Qt.Saturday)

        firstDayLabel = QLabel('Wee&k starts on:')
        firstDayLabel.setBuddy(self.firstDayCombo)

        self.selectionModeCombo = QComboBox()
        self.selectionModeCombo.addItem('Single selection', QCalendarWidget.SingleSelection)
        self.selectionModeCombo.addItem('None', QCalendarWidget.NoSelection)

        selectionModeLabel = QLabel('&Selection mode:')
        selectionModeLabel.setBuddy(self.selectionModeCombo)

        gridCheckBox = QCheckBox('&Grid')
        gridCheckBox.setChecked(self.calendar.isGridVisible())

        navigationCheckBox = QCheckBox('&Navigation bar')
        navigationCheckBox.setChecked(True)

        self.horizontalHeaderCombo = QComboBox()
        self.horizontalHeaderCombo.addItem('Single letter day names', QCalendarWidget.SingleLetterDayNames)
        self.horizontalHeaderCombo.addItem('Short day names', QCalendarWidget.ShortDayNames)
        self.horizontalHeaderCombo.addItem('None', QCalendarWidget.NoHorizontalHeader)
        self.horizontalHeaderCombo.setCurrentIndex(1)

        horizontalHeaderLabel = QLabel('&Horizontal header:')
        horizontalHeaderLabel.setBuddy(self.horizontalHeaderCombo)

        self.verticalHeaderCombo = QComboBox()
        self.verticalHeaderCombo.addItem('ISO week numbers', QCalendarWidget.ISOWeekNumbers)
        self.verticalHeaderCombo.addItem('None', QCalendarWidget.NoVerticalHeader)

        verticalHeaderLabel = QLabel('&Vertical header:')
        verticalHeaderLabel.setBuddy(self.verticalHeaderCombo)

        self.localeCombo.currentIndexChanged.connect(self.localeChanged)
        self.firstDayCombo.currentIndexChanged.connect(self.firstDayChanged)
        self.selectionModeCombo.currentIndexChanged.connect(self.selectionModeChanged)
        gridCheckBox.toggled.connect(self.calendar.setGridVisible)
        navigationCheckBox.toggled.connect(self.calendar.setNavigationBarVisible)
        self.horizontalHeaderCombo.currentIndexChanged.connect(self.horizontalHeaderChanged)
        self.verticalHeaderCombo.currentIndexChanged.connect(self.veritcalHeaderChanged)

        checkBoxLayout = QHBoxLayout()
        checkBoxLayout.addWidget(gridCheckBox)
        checkBoxLayout.addStretch()
        checkBoxLayout.addWidget(navigationCheckBox)

        outerLayout = QGridLayout()
        outerLayout.addWidget(localeLabel, 0, 0)
        outerLayout.addWidget(self.localeCombo, 0, 1)
        outerLayout.addWidget(firstDayLabel, 1, 0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值