Как добавить в календарь метки на даты?
Всем привет. Я хочу добавить к моему календарю метки на даты, которые у меня имеются в переменной.
Полагаю, необходимо передать date_list (переменную с датами) с родительского класса в этот метод и отметить все даты на календаре.
Нашел на форуме схожий вопрос Как изменить фон определённой ячейки в QCalendarWidget?.
Я хочу сделать так же, но только чтобы вместо списка 0 и 1 сразу подавался список дат (т.к. даты могут и добавляться и удаляться с этой переменной) + сохранить окрашивание сегодняшней даты, что я уже написал в paintCell.
Вот код моего CustomCalendar.py:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QDate, QPoint, Qt
class MyCalendar(QtWidgets.QCalendarWidget):
def __init__(self, parent=None):
QtWidgets.QCalendarWidget.__init__(self, parent)
def paintCell(self, painter, rect, date):
QtWidgets.QCalendarWidget.paintCell(self, painter, rect, date)
if date == date.currentDate():
painter.setBrush(QtGui.QColor(122, 27, 181, 50))
painter.setPen(QtGui.QColor(0, 0, 0, 0))
painter.drawRect(rect)
painter.setPen(QtGui.QPen(QtGui.QColor(110, 20, 160), 1, Qt.SolidLine, Qt.RoundCap))
painter.drawLine(rect.topRight(), rect.topLeft())
painter.drawLine(rect.topRight(), rect.bottomRight())
painter.drawLine(rect.bottomLeft(), rect.bottomRight())
painter.drawLine(rect.topLeft(), rect.bottomLeft())
Ответы (1 шт):
Автор решения: Alexander Chernin
→ Ссылка
Если я правильное вкурил, то вы хотите что-то типа вот такого:
class MyCalendar(QtWidgets.QCalendarWidget):
def __init__(self, parent=None):
QtWidgets.QCalendarWidget.__init__(self, parent)
self.dates = []
def setDates(self, dates):
# Копируем массив дат, переданных извне
self.dates = dares[:]
# Перерисовываем календарь
self.updateCells()
def paintCell(self, painter, rect, date):
QtWidgets.QCalendarWidget.paintCell(self, painter, rect, date)
# Рисуем сегодняшний день
if date == date.currentDate():
#...
# Иначе проверяем, находится ли дата (date) в массиве дат
elif date in self.dates:
# Сохраняем контекст рисования
painter.save()
# Рисуем дату и фон особым образом
painter.fillRect(rect, Qt.magenta)
# ...
# Восстанавливаем контекст рисования
painter.restore()
Дополнение Пример с передачей дат
class Window(QDialog):
def __init__(self):
super().__init__()
self.setGeometry(200,200,400,200)
self.setWindowTitle("MyCalendar")
vbox = QVBoxLayout()
self.calendar = MyCalendar()
self.calendar.setGridVisible(True)
self.button = QPushButton("Сlick me!")
# Клик для генерации списка дат
self.button.clicked.connect(self.generate)
vbox.addWidget(self.calendar)
vbox.addWidget(self.button)
self.setLayout(vbox)
# Генерируем список дат текущего месяца для подсветки
def generate(self):
month = self.calendar.monthShown()
year = self.calendar.yearShown()
dates = []
for i in range(randrange(10)):
day = randrange(28)
date = QDate(year, month, day)
dates.append(date)
# Передаем даты в наш календарь
self.calendar.setDates(dates)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())