На этом шаге рассмотрим класс QPaintEvent.
Qt поддерживает двойную буферизацию. Ее можно отключить вызовом метода QWidget::setAttribute(Qt::WA_PaintOnScreen). Вполне возможно, последствия вас удивят: дело в том, что некогда выведенная в окно графическая информация вдруг исчезнет при изменении размеров окна приложения или после перекрытия его окном другого приложения. Чтобы этого не произошло, необходимо получать и обрабатывать событие QPaintEvent.
В объекте класса QPaintEvent передается информация для перерисовки всего изображения или его части. Событие возникает тогда, когда виджет впервые отображается на экране явным или неявным вызовом метода show(), а также в результате вызова методов repaint() и update().
Объект события передается в метод paintEvent(), в котором реализуется отображение самого виджета. В большинстве случаев этот метод используется для полной перерисовки виджета. Для маленьких виджетов это приемлемо, но для виджетов больших размеров рациональнее перерисовывать только отдельную область, действительно нуждающуюся в этом. Для получения координат и размеров такого участка вызывается метод region(). Вызовом метода contains() можно проверить, находится ли объект в заданной области. Например:
MyClass::paintEvent(QPaintEvent* pe) { QPainter painter(this); QRect r(40, 40, 100, 100); if (pe->region().contains(r)) { painter.drawRect(r); } }
На следующем шаге рассмотрим событие мыши - класс QMouseEvent.