废话
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