QT 4: программирование GUI на С++
Шрифт:
Когда пользователь нажимает на клавиатуре какую-нибудь клавишу и фокус имеет построитель графиков Plotter, вызывается функция keyPressEvent. Мы ее переопределяем здесь, чтобы она реагировала на шесть клавиш: +, —, Up (вверх), Down (вниз), Left (влево) и Right (вправо). Если пользователь нажимает другую клавишу, мы вызываем реализацию этой функции из базового класса. Для простоты мы не учитываем ключи модификаторов Shift, Ctrl и Alt, доступ к которым осуществляется с помощью функции QKeyEvent::modifiers.
События колесика мышки возникают при повороте колесика мышки. В большинстве мышек предусматривается колесико для перемещения по вертикали, но некоторые мышки имеют также колесико для перемещения по горизонтали. Qt поддерживает оба вида колесиков. События колесика мышки передаются виджету, на котором находится фокус. Функция delta возвращает перемещение колесика, выраженное в восьмых долях градуса. Обычно шаг работы колесика мышки составляет 15 градусов. Здесь мы перемещаемся на заданное количество отметок, модифицируя верхний элемент стека масштабов изображений, и обновляем изображение, используя refreshPixmap.
Наиболее распространенное применение колесико мышки получило для продвижения по полосе прокрутки. При использовании нами QScrollArea (рассматривается в главе 6 ) с полосами прокрутки QScrollArea автоматически управляет событиями колесика мышки и нам не приходится самим переопределять функцию wheelEvent.
Этим завершается реализация обработчиков событий. Теперь давайте рассмотрим закрытые функции.
Функция updateRubberBand вызывается из mousePressEvent, mouseMoveEvent и mouseReleaseEvent для стирания или перерисовки резиновой ленты. Она состоит из четырех вызовов функции update, которая устанавливает в очередь событие рисования для четырех небольших прямоугольных областей, составляющих изображение резиновой ленты (две вертикальные и две горизонтальные линии). Для рисования резиновой ленты в Qt предусмотрен класс QRubberBand, однако в нашем случае ручное кодирование обеспечило более тонкое управление.
Функция refreshPixmap перерисовывает график на внеэкранной пиксельной карте и обновляет изображение на экране. Мы изменяем размеры пиксельной карты на размеры виджета и заполняем ее цветом стертого виджета. Этот цвет является «темным» компонентом палитры из-за вызова функции setBackgroundRole в конструкторе Plotter. Если фон задается неоднородной кистью, в функции QPixmap::fill необходимо указать смещение в виджете, где будет заканчиваться пиксельная карта, чтобы правильно выравнить образец кисти. Здесь пиксельная карта соответствует всему виджету, поэтому мы задаем позицию (0, 0).
Затем мы создаем QPainter для вычерчивания диаграммы на пиксельной карте. Вызов initFrom устанавливает в рисовальщике перо, фон и шрифт такими же, как для виджета Plotter. Затем мы вызываем функции drawGrid и drawCurves, которые рисуют диаграмму. В конце мы вызываем функцию update для инициации события рисования всего виджета. Пиксельная карта копируется в виджет функцией paintEvent.