The QCalendarWidget in PyQt6 is a widget for displaying and selecting dates from a calendar interface. It provides various customization options, including changing the display format, limiting the selectable range, and responding to user interactions.
This tutorial explains the basics of QCalendarWidget, demonstrates customization options, and includes several code examples.
1. Basics of QCalendarWidget
Key Features:
- Allows date selection with a calendar interface.
- Provides signals to respond to user interactions.
- Supports customization of displayed content and appearance.
Importing QCalendarWidget
from PyQt6.QtWidgets import QApplication, QMainWindow, QCalendarWidget from PyQt6.QtCore import QDate
2. Example 1: Simple Calendar
This example creates a simple calendar widget.
Code:
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QCalendarWidget class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Simple QCalendarWidget") calendar = QCalendarWidget() self.setCentralWidget(calendar) app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
Output:
- A window with a basic calendar allowing date selection.
3. Example 2: Handling Date Selection
In this example, the selectionChanged signal is used to respond when the user selects a date.
Code:
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QCalendarWidget from PyQt6.QtCore import QDate class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Handle Date Selection") self.calendar = QCalendarWidget() self.calendar.selectionChanged.connect(self.date_changed) self.setCentralWidget(self.calendar) def date_changed(self): selected_date = self.calendar.selectedDate() print(f"Selected Date: {selected_date.toString('yyyy-MM-dd')}") app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
Output:
- The console logs the selected date each time the user selects a different date.
4. Example 3: Setting a Minimum and Maximum Date
You can limit the selectable dates by setting a range with setMinimumDate and setMaximumDate.
Code:
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QCalendarWidget from PyQt6.QtCore import QDate class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Set Date Range") calendar = QCalendarWidget() # Set date range calendar.setMinimumDate(QDate(2023, 1, 1)) calendar.setMaximumDate(QDate(2023, 12, 31)) self.setCentralWidget(calendar) app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
5. Example 4: Customizing Date Formats
You can change the date display format using setDateTextFormat or customize the header with setHorizontalHeaderFormat and setVerticalHeaderFormat.
Code:
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QCalendarWidget from PyQt6.QtCore import QDate class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Customize Date Formats") calendar = QCalendarWidget() # Change header format calendar.setHorizontalHeaderFormat(QCalendarWidget.HorizontalHeaderFormat.ShortDayNames) calendar.setVerticalHeaderFormat(QCalendarWidget.VerticalHeaderFormat.NoVerticalHeader) # Highlight a specific date date = QDate.currentDate() format = calendar.dateTextFormat(date) format.setBackground(Qt.GlobalColor.yellow) calendar.setDateTextFormat(date, format) self.setCentralWidget(calendar) app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
6. Example 5: Responding to Double-Clicks
You can handle double-clicks on the calendar using the activated signal.
Code:
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QCalendarWidget from PyQt6.QtCore import QDate class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Double-Click Date") self.calendar = QCalendarWidget() self.calendar.activated.connect(self.date_activated) self.setCentralWidget(self.calendar) def date_activated(self, date): print(f"Double-clicked Date: {date.toString('yyyy-MM-dd')}") app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
7. Example 6: Marking Special Dates
You can visually distinguish special dates by applying a custom text format.
Code:
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QCalendarWidget from PyQt6.QtCore import QDate from PyQt6.QtGui import QTextCharFormat class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Mark Special Dates") calendar = QCalendarWidget() # Highlight special dates special_date = QDate(2023, 12, 25) format = QTextCharFormat() format.setForeground(Qt.GlobalColor.red) format.setBackground(Qt.GlobalColor.lightGray) calendar.setDateTextFormat(special_date, format) self.setCentralWidget(calendar) app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
8. Example 7: Navigating the Calendar Programmatically
You can navigate the calendar programmatically by setting a new date or moving to a month or year.
Code:
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QCalendarWidget from PyQt6.QtCore import QDate class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Programmatic Navigation") self.calendar = QCalendarWidget() # Set current date self.calendar.setSelectedDate(QDate(2023, 7, 4)) # Jump to a specific month/year self.calendar.showSelectedDate(QDate(2023, 12, 25)) self.setCentralWidget(self.calendar) app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
Summary of Key Features:
- Date Range: Restrict user selection to specific dates.
- Custom Formatting: Highlight or distinguish dates with custom text or background formatting.
- Signals: Respond to user interactions with selectionChanged and activated signals.
- Navigation: Programmatically navigate to specific dates or months.
These examples demonstrate how to leverage the QCalendarWidget for various date-selection tasks, ranging from simple usage to advanced customization.