Выделите интервал дат в виджете календаря Qt5 - PullRequest
1 голос
/ 30 сентября 2019

Я хочу выделять каждый день в CalendarWidget, который находится между выбранной датой начала и окончания. Моя проблема в том, что CalendarWidget разрешает SingleSelection только в QTCreator, но говорит, что другие вещи могут быть изменены программно.

Я нашел несколько подсказок, чтобы использовать 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)

1 Ответ

2 голосов
/ 30 сентября 2019

Для обновления стиля отдельных дат вы можете использовать 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()

Снимок экрана:

screenshot of calendar with selection

...