Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Апгрейд QCalendarWidget
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
giker
Всем хорошего дня.
Нужно сделать компонент на основе QCalendarWidget в ячейках которого кроме числа будет отображаться дополнительная информация. Дополнительная информация должна отображаться только для выбранной даты. То есть мне надо знать область рисования выбранной ячейки календаря.
В исходном коде класса есть метод
void QCalendarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                              const QModelIndex &index) const
{
    QDate date = calendarWidgetPrivate->m_model->dateForCell(index.row(), index.column());
    if (date.isValid())
    {
        storedOption = option;
        QRect rect = option.rect;
        calendarWidgetPrivate->paintCell(painter, rect, date);
    }
    else
    {
        QItemDelegate::paint(painter, option, index);
    }
}


который и отвечают за прорисовку ячеек, но непонятно откуда он вызывается и откуда берется информация об области в которую происходит отрисовка. Не понятно также какой метод отрисовывает выбранную ячейку. Непонятно как связан класс QCalendarDelegate с классом QCalendarWidget.
Litkevich Yuriy
методы делагатов вызывают представления, например метод paint, представления вызывают в своём обработчике события рисования (paintEvent)
giker
Вопрос решен. Для того что бы нужная нам информация отображалась в выбранной ячейке календаря создаем класс-наследник от QCalendarWidget, в котором переопределяем метод paintCell
void NewCalendarWidget::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const
{
    if (date != selectedDate())
    {
        QCalendarWidget::paintCell(painter, rect, date);
    }
    else
    {
       //здесь отрисовываем нужную нам информацию в ячейку
    }
}


Но, если переопределить только этот метод, то при изменении даты, отображается информация соответствующая ячейке которая была выбрана до текущей, вызов методов paint() или update() не помогает. Для того что бы отображать актуальную информацию нужно вывести в публичные члены метод updateCells():

>NewCalendarWidget.cpp<
void NewCalendarWidget::updateCells()
{
    QCalendarWidget::updateCells();
}


>NewCalendarWidget.h<
public:
         void updateCells();


И вызывать его при смене выбранной даты после передачи календарю всей необходимой информации.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.