Возможно ли как-то вставить иконку в ячейку календаря в 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_())
