Как изменить фон определённой ячейки в 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_())
