#python #pyqt #pyqt5
#python #pyqt #pyqt5
Вопрос:
Я хотел бы поместить текст p.drawText (r.x () 10, r.y () 33, '{} / {}'. Format ('tset1', 'test2')
условия на выбранную QCalendarWidget
дату. Но это нехорошо.
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class main_window(QWidget):
def __init__(self):
super(main_window, self).__init__()
self.resize(1280, 900)
self.Calendar()
def Calendar(self):
self.cal = QCalendarWidget(self)
self.cal.resize(500, 500)
self.cal.clicked.connect(self.Calendar_click)
def Calendar_click(self):
p = QPainter()
r = QRect(0,0,10,10)
d = self.cal.selectedDate()
self.cal.paintCell(p, r, d)
if (d == QDate.currentDate()):
f = QFont()
f.setPixelSize(10)
f.setBold(True)
f.setItalic(True)
p.setFont(f)
p.drawText(r.x() 10, r.y() 33, '{}/{}'.format('tset1','test2'))
if __name__ == '__main__':
app = QApplication(sys.argv)
main = main_window()
main.show()
Я перепробовал много, но я до сих пор не знаю, как поместить маленький текст в выбранную дату.
Ответ №1:
Вы должны перезаписать paintCell()
метод, поскольку этот метод вызывается в paintEvent():
class CalendarWidget(QCalendarWidget):
def paintCell(self, painter, rect, date):
super(CalendarWidget, self).paintCell(painter, rect, date)
if date == self.selectedDate():
painter.save()
f = QFont()
f.setPixelSize(10)
f.setBold(True)
f.setItalic(True)
painter.setFont(f)
r = rect
painter.drawText(
rect.topLeft() QPoint(10, 33),
"{}/{}".format("tset1", "test2"),
)
painter.restore()
class main_window(QWidget):
def __init__(self):
super(main_window, self).__init__()
self.resize(1280, 900)
self.Calendar()
def Calendar(self):
self.cal = CalendarWidget(self)
self.cal.resize(500, 500)
Обновить:
Если вы хотите, чтобы текст остался, вы должны сохранить дату и при необходимости перерисовать, поскольку Qt перерисовывает все
class CalendarWidget(QCalendarWidget):
def __init__(self, parent=None):
super(CalendarWidget, self).__init__(parent)
self._selected_dates = set()
self._selected_dates.add(self.selectedDate())
self.clicked.connect(self.on_clicked)
@pyqtSlot(QDate)
def on_clicked(self, date):
self._selected_dates.add(date)
def paintCell(self, painter, rect, date):
super(CalendarWidget, self).paintCell(painter, rect, date)
if date in self._selected_dates:
painter.save()
f = QFont()
f.setPixelSize(10)
f.setBold(True)
f.setItalic(True)
painter.setFont(f)
r = rect
painter.drawText(
rect.topLeft() QPoint(10, 33),
"{}/{}".format("tset1", "test2"),
)
painter.restore()
Комментарии:
1. Вау! Спасибо. Наконец, я хотел бы сохранить один выделенный текст, но что мне делать?
2. @Lee Я тебя не понимаю, объясни лучше, ты хочешь, чтобы текст оставался даже при выборе другой даты?
3. Да, если вы выберете другую дату, вот как вы сохраните текст.
4. Спасибо 🙂 Это сложно, но очень полезно.