Как изменить фон определённой ячейки в QCalendarWidget?

Есть массив данных [0,1,0,0,0,1,1,0,0,1,1,1,1,0,0] для каждого дня из текущего месяца (одно значение для одного дня).

Каким образом я могу покрасить определённую ячейку QCalendaryWidget в определённый (например, красный) цвет?

Интересует именно изменения background-color одной ячейки QCalendaryWidget по датам.

Пример:

a = [0,1,0,0,0,1,1,0,0,1,1,1,1,0,0]
i = 0
while i < len(a):
    if (a[i] == 0):
        print('Красим красным день i')
    else:
        print('Красим зелёным день i')
    i += 1

Ответы (1 шт):

Автор решения: S. Nick

void QCalendarWidget::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const

Закрашивает ячейку, указанную по заданной date, используя заданный painter и rect.

Я увидел вашу задачу так:

import sys
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import QTextCharFormat, QBrush, QColor, QPen
from PyQt5.QtWidgets import QApplication, QCalendarWidget


class CalendarWidget(QCalendarWidget):
    def __init__(self, *args, **kwargs):
        super(CalendarWidget, self).__init__(*args, **kwargs)
        
        self._dict = {
            "202107": [None, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0],
            "202108": [None, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1],
        }
        # Скрыть номер недели слева
        self.setVerticalHeaderFormat(self.NoVerticalHeader)

        # Изменить цвета субботы и воскресенья
        fmtGreen = QTextCharFormat()
        fmtGreen.setForeground(QBrush(Qt.green))
        self.setWeekdayTextFormat(Qt.Saturday, fmtGreen)
        fmtOrange = QTextCharFormat()
        fmtOrange.setForeground(QBrush(QColor(252, 140, 28)))
        self.setWeekdayTextFormat(Qt.Sunday, fmtOrange)

    def paintCell(self, painter, rect, date):
        QCalendarWidget.paintCell(self, painter, rect, date)
        y_m, day = date.toString("yyyyMM"), date.day()
        v = self._dict.get(y_m)
        
        if v:
            #print(f'y_m={y_m}, day={day}, v={v}')
            if len(v)-1 >= day and v[day]:
                painter.setBrush(QColor(255, 77, 77, 70))                  
                painter.setPen(QPen(QColor(250, 0, 0), -1.0, Qt.SolidLine)) 
                rect = QRect(rect.x(), rect.y(), rect.width()-1, rect.height()-1)  
                painter.drawRect(rect)

StyleSheet = '''

/* ниже календарной формы */
#qt_calendar_calendarview {
    outline: 0px;                  /* Удалить выделенную пунктирную рамку */
    selection-background-color: rgb(220, 188, 212); /* Выберите цвет фона */
}
'''


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    w = CalendarWidget()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка