PyQt5 QCalendarWidget 获取窗口修改的属性

  • Post category:Python

当使用 PyQt5 开发 GUI 程序时,需要使用 QCalendarWidget 包含日期时间选择器界面。本篇文章将详细讲解如何获取 PyQt5 QCalendarWidget 窗口修改的属性。

1. 基本使用

PyQt5 QCalendarWidget 继承了 QWidget 类,可以通过它的 signal 来监听窗口修改的事件。比如,可以监听QCalendarWidget的clicked信号或者activated信号来捕获当前选中的日期:

from PyQt5.QtWidgets import QApplication, QCalendarWidget
from PyQt5.QtCore import QDate


def show_date(date: QDate):
    print(f'Date changed: {date.toString()}')


app = QApplication([])

cal_widget = QCalendarWidget()
cal_widget.clicked.connect(show_date)

cal_widget.show()
app.exec_()

在上面的代码中,我们创建了一个 QCalendarWidget 窗口,并监听了它的 clicked 事件。一旦一个日期小部件被选中,日期的信息将被转换成QDate类型,并传递给show_date 函数进行处理。show_date 函数只是打印当前选中日期。

2. 获取窗口属性

获取当前选中日期

通过 QCalendarWidget 的 selectedDate 方法获取当前日期:

from PyQt5.QtWidgets import QApplication, QCalendarWidget
from PyQt5.QtCore import QDate


def show_date(date: QDate):
    print(f'Date changed: {date.toString()}')    

app = QApplication([])

cal_widget = QCalendarWidget()
cal_widget.clicked.connect(show_date)

cal_widget.show()

# 获取选中日期
selected_date = cal_widget.selectedDate()
print(f'Current date: {selected_date.toString()}')

app.exec_()

上面的代码中,我们创建了 QCalendarWidget 窗口,并在 clicked 连接上事件处理函数。接着,在主循环 event loop 之前,获取当前选中的日期并打印到控制台。

改变日期显示格式

可以通过 setHeaderFormat 方法改变日期显示的格式:

from PyQt5.QtWidgets import QApplication, QCalendarWidget
from PyQt5.QtCore import QDate


def show_date(date: QDate):
    print(f'Date changed: {date.toString()}')    

app = QApplication([])

cal_widget = QCalendarWidget()
cal_widget.clicked.connect(show_date)

# 改变日期显示格式
cal_widget.setHeaderFormat("yyyy-MM")

cal_widget.show()

app.exec_()

上面的代码改变了 QCalendarWidget 的日期显示格式为”yyyy-MM”,可以在头部标题显示出当前选中的年份和月份。

3. 示例

以下是一个简单的窗口示例,演示了如何创建一个包含 QCalendarWidget 组件的窗口。用户能够通过点击日期来更改所选日期(格式为 “yyyy-MM-dd”)。

from PyQt5.QtWidgets import QApplication, QWidget, QCalendarWidget, QLabel, QVBoxLayout
from PyQt5.QtGui import QTextCharFormat
from PyQt5.QtCore import QDate, Qt


class CalendarWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('PyQt5 QCalendarWidget 获取窗口修改的属性')
        self.setGeometry(100, 100, 400, 400)

        # 添加QCalendarWidget小部件
        self.calendar = QCalendarWidget()
        self.calendar.setGridVisible(True)
        self.calendar.selectionChanged.connect(self.show_selected_date)

        # 添加QLabel部件
        self.label = QLabel(self)
        self.label.setAlignment(Qt.AlignCenter)

        #格式化QTextCharFormat对象中的日期
        date_format = QTextCharFormat()
        date_format.setBackground(Qt.green)
        self.calendar.setDateTextFormat(QDate.currentDate(), date_format)

        # 添加垂直QVBoxLayout布局
        layout = QVBoxLayout()
        layout.addWidget(self.calendar)
        layout.addWidget(self.label)
        self.setLayout(layout)

    def show_selected_date(self):
        selected_date = self.calendar.selectedDate()
        self.label.setText(selected_date.toString(Qt.ISODate))


if __name__ == '__main__':
    app = QApplication([])
    w = CalendarWindow()
    w.show()
    app.exec_()

在上面的代码中,我们创建了一个包含QCalendarWidget小部件和一个QLabel部件的窗口。当用户点击日期时,show_selected_date() 函数捕获了日期更改事件,并打印当前所选日期,格式为”yyyy-MM-dd”。