Как сделать чтобы пользователь мог выбрать несколько дат мышкой CalendarWidget в PyQt5 и они отметились другим светом или рамкой
Я пытаюсь сделать приложение, где человек может выбрать несколько дат в календаре с помощи мышки и отметить в нем несколько дат и чтобы эти даты отметились другим шрифтом (цветом) или как-нибудь выделились например рамкой. Пример выделанных дат прилагаю в фото.
Я нашел в гугле такое решение. Наследовал класс QCalendarWidget и переопределил метод paintCell, но не смог его сделать динамическим, т.е. он уже создается в приложении только с отмеченными датами, не смог в него передать даты при клике, чтобы они отмечались.
from PyQt5.QtWidgets import QCalendarWidget
from PyQt5.QtCore import QDate, QPoint, Qt
class Scheduler(QCalendarWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.events = {
QDate(2021, 8, 5): ["Bob's birthday"],
QDate(2021, 8, 16): ["Alice's birthday"]
}
def paintCell(self, painter, rect, date):
super().paintCell(painter, rect, date)
if date in self.events:
painter.setBrush(Qt.red)
painter.drawEllipse(rect.topLeft() + QPoint(12, 7), 3, 3)
Ответы (1 шт):
void QCalendarWidget::clicked(const QDate &date)
Этот сигнал излучается при нажатии кнопки мыши. Дата щелчка мыши указывается по дате. Сигнал излучается только при нажатии на действительную дату, например, даты не выходят за пределы minimumDate() и maximumDate(). Если выбран режим NoSelection, этот сигнал не будет выдан.
from PyQt5.QtWidgets import QCalendarWidget, QApplication
from PyQt5.QtCore import QDate, QPoint, Qt
class Scheduler(QCalendarWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.events = {
QDate(2021, 8, 5): ["Bob's birthday"],
QDate(2021, 8, 16): ["Alice's birthday"]
}
self.clicked['QDate'].connect(self.show_date_func)
def paintCell(self, painter, rect, date):
super().paintCell(painter, rect, date)
if date in self.events:
painter.setBrush(Qt.red)
painter.drawEllipse(rect.topLeft() + QPoint(12, 7), 3, 3)
def show_date_func(self, date):
self.events[date] = 'Hello World'
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
w = Scheduler()
w.show()
sys.exit(app.exec_())

