При меньших размерах считается, что график будет слишком мал и бесполезен.

QSize Plotter::sizeHintO const {

return QSize(12 * Margin, 8 * Margin);

}

В функции sizeHintO мы возвращаем «идеальный» размер относительно конс­танты Margin, причем горизонтальный и вертикальный компоненты этого размера составляют ту же самую приятную для глаза пропорцию 3:2, которую мы использо­вали для minimumSizeHint().

Мы завершаем рассмотрение открытых функций и слотов построителя графи­ков Plotter. Теперь давайте рассмотрим защищенные обработчики событий.

void Plotter::paintEvent(QPaintEvent * /* event */) {

QStylePainter painter(this); painter.drawPixmap(0. 0, pixmap);

if (rubberBandlsShown) {

painter. setPen(palette(). light(). colorO); painter.drawRect(rubberBandRect.normalized()

.adjusted(0, 0, -1, -1));

}

if (hasFocusO) {

QStyleOptionFocusRect option; option.initFrom(this);

option.backgroundColor = palette().dark().color(); painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);

}

}

Обычно все действия по рисованию выполняются функцией paintEvent(). Но в данном случае вся диаграмма уже нарисована функцией ref reshPixmap(), и поэтому мы можем воспроизвести весь график, просто копируя пиксельную карту в виджет в позицию (0,0).

Если резиновая лента должна быть видимой, мы рисуем ее поверх графика. Мы используем светлый («light>) компонент из текущей цветовой группы виджета в ка­честве цвета пера для обеспечения хорошего контраста с темным («dark») фоном. Следует отметить, что мы рисуем непосредственно на Виджете, оставляя нетронутым внеэкранное изображение на пиксельной карте. Вызов QRect:: normalized() гаранти­рует наличие положительных значений ширины и высоты прямоугольника резино­вой ленты (выполняя обмен значений координат при необходимости), а вызов ad-justed() уменьшает размер прямоугольника на один пиксель, позволяя вывести на экран его контур шириной в один пиксель.

Если Plotter получает фокус, вывод фокусного прямоугольника выполняется с использованием функции drawPrimitive(), задающей стиль виджета, с передачей QStyle: :PE_FrameFocusRect в качестве первого аргумента и объекта QStyleOptionFo-cusRect в качестве второго аргумента. Опции рисования фокусного прямоугольника наследуются от виджета Plotter (путем вызова initFrom()). Цвет фона должен зада­ваться явно.


<< назад вперед >>