子类化QCalendarWidget时paintCell()函数中的Painter错误

时间:2018-01-15 12:16:59

标签: c++ qt qt5 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 parent时,我在尝试设置画笔时遇到此错误: “QPainter :: setBrush:画家不活跃” 我想,我在错误的地方创建QPainter对象。 谁知道,如何解决这个问题?

我使用的是Qt wiki片段: https://wiki.qt.io/How_to_create_a_custom_calender_widget

1 个答案:

答案 0 :(得分:2)

您不应直接绘制,因为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