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()). Цвет фона должен задаваться явно.
<< назад вперед >>