Можно ли отключить субботу и воскресенье в QCalendarWidget?

Я хочу, чтобы пользователь мог выбрать понедельник, вторник, среду, четверг или пятницу (будние дни) в QCalendarWidget. Но не в субботу и не в воскресенье. (выходные дни)

  • Доступна ли эта функция для QCalendarWidget?
  • Если нет, то как отключить дату в календаре?

person ukll    schedule 28.12.2017    source источник
comment
Кажется, решение не доработано, поэтому я считаю этот ответ недействительным, поэтому я удаляю свой заключительный голос.   -  person eyllanesc    schedule 28.12.2017


Ответы (1)


Вы можете написать собственный CalendarWidget и перекрасить ячейку по своему усмотрению. По вашему запросу вы можете проверить, что date.dayOfWeek() равно 6 или 7.

В этом примере виджет календаря может изменить цвет выбранной даты, если дата выпадает на будние дни, и не изменить цвет, если дата выпадает на выходные. Но календарь виджета по-прежнему получает событие clicked. Надеюсь, это поможет.

TestCalendar.h

class TestCalendar: public QCalendarWidget//: public QWidget//
{
    Q_OBJECT

    Q_PROPERTY(QColor color READ getColor WRITE setColor)
public:
    TestCalendar(QWidget* parent = 0);//();//
    ~TestCalendar();

    void setColor(QColor& color);
    QColor getColor();

protected:
    virtual void paintCell(QPainter* painter, const QRect &rect, const QDate &date) const;

private:

    QDate m_currentDate;
    QPen m_outlinePen;
    QBrush m_transparentBrush;
};

TestCalendar.cpp

#include <QtWidgets>

#include "TestCalendar.h"

TestCalendar::TestCalendar(QWidget *parent)
    : QCalendarWidget(parent)
{   
    m_currentDate = QDate::currentDate();
    m_outlinePen.setColor(Qt::blue);
    m_transparentBrush.setColor(Qt::transparent);
}

TestCalendar::~TestCalendar()
{
}

void TestCalendar::setColor(QColor &color)
{
    m_outlinePen.setColor(color);
}

QColor TestCalendar::getColor()
{
    return m_outlinePen.color();
}

void TestCalendar::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const
{   
    if (date.dayOfWeek() == 6 or date.dayOfWeek() == 7) {
        painter->save();
        painter->drawText(rect, Qt::AlignCenter,QString::number(date.day()));
        painter->restore();
    } else {
        QCalendarWidget::paintCell(painter, rect, date);
    }
}

РЕДАКТИРОВАТЬ:

Я добавляю изображение введите здесь описание изображения

person GAVD    schedule 28.12.2017
comment
Спасибо за ответ. Ваш код компилируется. Однако он не меняет цвет ни в будни, ни в выходные. Также в заголовочном файле есть объявление указателя QCalendarWidget. Но он нигде не используется. Вы ничего не забыли? - person ukll; 29.12.2017
comment
Извините, я забыл тестовый код *calendar. Когда вы нажимаете на рабочие дни, он меняет цвет? - person GAVD; 29.12.2017
comment
Ваш код меняет цвет чисел в выходные дни на черный, а фон на белый. Но больше ничего не делает. Он даже не меняет цифры на другие цвета. Извините за частые правки. - person ukll; 29.12.2017