Ошибка художника в функции paintCell () при создании подкласса QCalendarWidget

Я хочу создать календарь, который будет отмечать несколько дат, введенных пользователем.
Итак, я создал подкласс QCalendarWidget и переопределил функцию painCell.
Вот мой упрощенный код:

MyCalendar::MyCalendar(QWidget *parent)
: QCalendarWidget(parent)
{
painter = new QPainter(this);
}
void MyCalendar::setHolidays(QDate date)
{
paintCell(painter, rect(),date);
}

void MyCalendar::paintCell(QPainter * painter, const QRect & rect, const QDate & date) const
{
painter->setBrush(Qt::red);
QCalendarWidget::paintCell(painter, rect, date);
}

Я не могу этого сделать, потому что при создании объекта QPainter я получаю следующее сообщение:
«QWidget :: paintEngine: больше не должен вызываться
QPainter :: begin: Устройство рисования возвратило двигатель == 0, тип: 1 «

Когда я не устанавливаю родительский объект Painter, я получаю эту ошибку при попытке установить кисть:
«QPainter :: setBrush: Painter не активен» Я думаю, я создаю объект QPainter в неправильном месте.
Кто-нибудь знает, как это решить?

Я использовал фрагмент Qt wiki:
https://wiki.qt.io/How_to_create_a_custom_calender_widget

0

Решение

Вы не должны рисовать напрямую, поскольку метод paintCell вызывается внутренне, поэтому целесообразно сохранить даты в списке, и если дата, используемая paintCell, содержится в этом списке, нарисуйте его персонализированным способом:

#ifndef MYCALENDAR_H
#define MYCALENDAR_H

#include <QCalendarWidget>
#include <QPainter>
class MyCalendar : public QCalendarWidget
{
public:
MyCalendar(QWidget *parent=Q_NULLPTR):QCalendarWidget{parent}{

}
void addHoliday(const QDate &date){
mDates<<date;
updateCell(date);
}
void paintCell(QPainter * painter, const QRect & rect, const QDate & date) const{
if(mDates.contains(date)){
painter->save();
painter->setBrush(Qt::red);
painter->drawRect(rect);
painter->drawText(rect, Qt::AlignCenter|Qt::TextSingleLine, QString::number(date.day()));
painter->restore();
}
else
QCalendarWidget::paintCell(painter, rect, date);

}
private:
QList<QDate> mDates;
};

#endif // MYCALENDAR_H
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]