【问题标题】:Highlight date interval in a Qt5 Calendar Widget在 Qt5 日历小部件中突出显示日期间隔
【发布时间】:2020-01-29 14:41:36
【问题描述】:

我想在选定的开始日期和结束日期之间的 CalendarWidget 中突出显示每一天。 我的问题是 CalendarWidget 只允许 QTCreator 中的 SingleSelection ,但表示可以通过编程方式更改其他内容。

我发现了一些使用 QPainter 和 paintCell() 方法的提示,但我直到不知道从哪里开始。互联网对我没有帮助。 我尝试先在 buttonClick 上更改一个日期,但即使这样也没有用,您能给我建议如何使用它吗?

btn_test_pressed(self):
    painter = QPainter()
    painter.setPen(QtGui.QPen(QtCore.Qt.green))
    painter.fillRect(QtCore.QRectF(250, 250, 10, 10), 0, 5760)
    rect = QRect()
    date = datetime.datetime.now() - datetime.timedelta(1)
    self.calendarWidget.paintCell(painter, rect, date)

【问题讨论】:

    标签: python pyqt pyqt5 qcalendarwidget


    【解决方案1】:

    要更新单个日期的样式,您可以使用QCalendarWidget.setDateTextFormat()。以下是如何使用它来突出显示日期范围的基本实现,可以通过在按住 shift 键的同时选择开始日期和结束日期来选择日期范围。

    from PyQt5.QtGui import QPalette, QTextCharFormat
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QApplication, QCalendarWidget
    
    class MyCalendar(QCalendarWidget):
        def __init__(self):
            super().__init__()
            self.begin_date = None
            self.end_date = None
    
            self.highlight_format = QTextCharFormat()
            self.highlight_format.setBackground(self.palette().brush(QPalette.Highlight))
            self.highlight_format.setForeground(self.palette().color(QPalette.HighlightedText))
    
            self.clicked.connect(self.date_is_clicked)
            print(super().dateTextFormat())
    
        def format_range(self, format):
            if self.begin_date and self.end_date:
                d0 = min(self.begin_date, self.end_date)
                d1 = max(self.begin_date, self.end_date)
                while d0 <= d1:
                    self.setDateTextFormat(d0, format)
                    d0 = d0.addDays(1)
    
        def date_is_clicked(self, date):
            # reset highlighting of previously selected date range
            self.format_range(QTextCharFormat())
            if QApplication.instance().keyboardModifiers() & Qt.ShiftModifier and self.begin_date:
                self.end_date = date
                # set highilighting of currently selected date range
                self.format_range(self.highlight_format)
            else:
                self.begin_date = date
                self.end_date = None
    
    if __name__ == "__main__":
        app = QApplication([])
        calendar = MyCalendar()
        calendar.show()
        app.exec()
    

    截图:

    【讨论】:

    • 谢谢,一切正常。你能解释一下当self.clicked.connect(self.date_is_clicked) 仍然是“空”时def date_is_clicked(self, date): 是如何获得date 参数的吗?
    • 发出信号时的日期。当用户点击一个日期时,QCalendar.clicked 信号通过执行类似QCalendar.clicked.emit(date) 的东西发出。任何连接到这个信号的槽都会被调用,并以这个日期为参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多