Возможно ли как-то вставить иконку в ячейку календаря в Pyqt?

from PyQt5 import QtGui
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QCalendarWidget
from PyQt5.QtCore import QPoint, Qt, QRectF, QDate
from PyQt5.QtGui import QIcon, QImage, QPainter, QColor, QFont, QBrush, QPixmap


class CalendarWidget(QCalendarWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.parent = parent

    def paintCell(self, painter, rect, date):
        painter.setRenderHint(QPainter.Antialiasing, True)
        if date == self.parent.date:
            painter.save()
            #---------Эксперименты с заливкой---------
            self.brush = QBrush(Qt.Dense7Pattern)
            self.brush.setColor(Qt.red)
            painter.setBrush(self.brush)
            painter.drawRect(rect)

            #---------Проблемное место---------
            icon = QIcon("smile.ico")
            painter.drawPicture(0, 0, icon)
            #----------------------------------

            #Здесь эксперименты с текстом в ячейке
            painter.setFont(QFont('Decorative', 10))
            painter.drawText(QRectF(rect), Qt.TextSingleLine |
                             Qt.AlignCenter, str(date.day()))
            painter.drawText(rect, Qt.AlignCenter, '\n\nДата назначена')
            painter.setBrush(Qt.red)
            painter.drawEllipse(rect.topLeft() + QPoint(12, 7), 3, 3)
            painter.restore()
        else:
            QCalendarWidget.paintCell(self, painter, rect, date)


class Ui_Form(object):
    def setupUi(self, Form):
        self.resize(750, 650)
        self.Calendar = CalendarWidget(Form)

        self.Calendar.setGeometry(3, 10, 740, 550)
        self.Calendar.setStyleSheet(
            "QCalendarWidget QTableView{\n""font-size: 30px;\n""/*color: white;\n""background-color: transparent;*/\n""}")
        self.Calendar.setObjectName("calendarWidget")
        # Кнопка
        self.SelectDate = QPushButton(Form)
        self.SelectDate.setGeometry(250, 580, 220, 60)
        self.SelectDate.setStyleSheet(
            "font-size: 40px;\n""color: white;\n""background: lightgreen;")
        self.SelectDate.setText("Отметить")


class Logic(QWidget, Ui_Form):
    date = None

    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.SelectDate.clicked.connect(lambda: self.fillDate())

    def fillDate(self):
        self.date = self.Calendar.selectedDate()

        self.Calendar.updateCells()


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    window = Logic()
    window.show()
    sys.exit(app.exec_())

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

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

void QPainter::drawPixmap(int x, int y, const QPixmap &pixmap, int sx, int sy, int sw, int sh)

Рисует растровое изображение в точках (x, y), копируя часть данного растрового изображения в устройство рисования.

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, \
    QCalendarWidget
from PyQt5.QtCore import QPoint, Qt, QRectF, QDate
from PyQt5.QtGui import QIcon, QImage, QPainter, QColor, \
    QFont, QBrush, QPixmap, QPicture


class CalendarWidget(QCalendarWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.parent = parent

    def paintCell(self, painter, rect, date):
        painter.setRenderHint(QPainter.Antialiasing, True)
        if date == self.parent.date:
            painter.save()
            #---------Эксперименты с заливкой---------
            self.brush = QBrush(Qt.Dense7Pattern)
            self.brush.setColor(Qt.red)
            painter.setBrush(self.brush)
            painter.drawRect(rect)
            
            x, y, w, h = rect.x(), rect.y(), rect.width(), rect.height()
            #print(x, y, w, h) 

#---------Проблемное место---------
            
#            icon = QIcon("smile.ico")
#            painter.drawPicture(0, 0, icon)
#            painter.drawPicture(0, 0, self.picture)

            p = QPixmap("head2.jpg").scaled(
                w, h,
                Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation
            )
            painter.drawPixmap(x, y, p)
           
#----------------------------------
            
            #Здесь эксперименты с текстом в ячейке
            painter.setFont(QFont('Decorative', 10))
            painter.drawText(QRectF(rect), Qt.TextSingleLine |
                             Qt.AlignCenter, str(date.day()))
            painter.drawText(rect, Qt.AlignCenter, '\n\nДата назначена')
            painter.setBrush(Qt.red)
            painter.drawEllipse(rect.topLeft() + QPoint(12, 7), 3, 3)
            
            painter.restore()
        else:
            QCalendarWidget.paintCell(self, painter, rect, date)


class Ui_Form(object):
    def setupUi(self, Form):
        self.resize(750, 650)
        self.Calendar = CalendarWidget(Form)

        self.Calendar.setGeometry(3, 10, 740, 550)
        self.Calendar.setStyleSheet("""
            QCalendarWidget QTableView {
                font-size: 30px;
                /*color: white;
                background-color: transparent;*/
            }
        """)
        self.Calendar.setObjectName("calendarWidget")
        # Кнопка
        self.SelectDate = QPushButton(Form)
        self.SelectDate.setGeometry(250, 580, 220, 60)
        self.SelectDate.setStyleSheet(
            "font-size: 40px;\n""color: white;\n""background: lightgreen;")
        self.SelectDate.setText("Отметить")


class Logic(QWidget, Ui_Form):
    date = None

    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.SelectDate.clicked.connect(lambda: self.fillDate())

    def fillDate(self):
        self.date = self.Calendar.selectedDate()

        self.Calendar.updateCells()


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    window = Logic()
    window.show()
    sys.exit(app.exec_())

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

→ Ссылка