crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Апгрейд QCalendarWidget
giker
  опции профиля:
сообщение 18.5.2010, 10:23
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 18.5.2010
Пользователь №: 1731

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем хорошего дня.
Нужно сделать компонент на основе 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
  опции профиля:
сообщение 18.5.2010, 15:21
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


методы делагатов вызывают представления, например метод paint, представления вызывают в своём обработчике события рисования (paintEvent)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
giker
  опции профиля:
сообщение 20.5.2010, 8:23
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 18.5.2010
Пользователь №: 1731

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вопрос решен. Для того что бы нужная нам информация отображалась в выбранной ячейке календаря создаем класс-наследник от 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();


И вызывать его при смене выбранной даты после передачи календарю всей необходимой информации.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.9.2019, 0:52