Я хочу поместить текст в pyqt QCalendarWidget

#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. Спасибо 🙂 Это сложно, но очень полезно.