Читаем QT 4: программирование GUI на С++ полностью

155 zoomStack[сurZoom].scrol1(+1, 0);

156 refreshPixmap;

157 break;

158 case Qt::Key_Down:

159 zoomStack[curZoom].scroll(0, -1);

160 refreshPixmap;

161 break;

162 case Qt::Key_Up:

163 zoomStack[curZoom].scroll(0, +1);

164 refreshPixmap;

165 break;

166 default:

167 QWidget::keyPressEvent(event);

168 }

169 }

Когда пользователь нажимает на клавиатуре какую-нибудь клавишу и фокус имеет построитель графиков Plotter, вызывается функция keyPressEvent. Мы ее переопределяем здесь, чтобы она реагировала на шесть клавиш: +, —, Up (вверх), Down (вниз), Left (влево) и Right (вправо). Если пользователь нажимает другую клавишу, мы вызываем реализацию этой функции из базового класса. Для простоты мы не учитываем ключи модификаторов Shift, Ctrl и Alt, доступ к которым осуществляется с помощью функции QKeyEvent::modifiers.

170 void Plotter::wheelEvent(QWheelEvent *event)

171 {

172 int numDegrees= event->delta / 8;

173 int numTicks = numDegrees / 15;

174 if (event->orientation == Qt::Horizontal) {

175 zoomStack[curZoom].scroll(numTicks, 0);

176 } else {

177 zoomStack[curZoom].scroll(0, numTicks);

178 }

179 refreshPixmap;

180 }

События колесика мышки возникают при повороте колесика мышки. В большинстве мышек предусматривается колесико для перемещения по вертикали, но некоторые мышки имеют также колесико для перемещения по горизонтали. Qt поддерживает оба вида колесиков. События колесика мышки передаются виджету, на котором находится фокус. Функция delta возвращает перемещение колесика, выраженное в восьмых долях градуса. Обычно шаг работы колесика мышки составляет 15 градусов. Здесь мы перемещаемся на заданное количество отметок, модифицируя верхний элемент стека масштабов изображений, и обновляем изображение, используя refreshPixmap.

Наиболее распространенное применение колесико мышки получило для продвижения по полосе прокрутки. При использовании нами QScrollArea (рассматривается в главе 6) с полосами прокрутки QScrollArea автоматически управляет событиями колесика мышки и нам не приходится самим переопределять функцию wheelEvent.

Этим завершается реализация обработчиков событий. Теперь давайте рассмотрим закрытые функции.

181 void Plotter::updateRubberBandRegion

182 {

183 QRect rect = rubberBandRect.normalized;

184 update(rect.left, rect.top, rect.width, 1);

185 update(rect.left, rect.top, 1, rect.height);

186 update(rect.left, rect.bottom, rect.width, 1);

187 update(rect.right, rect.top, 1, rect.height);

188 }

Функция updateRubberBand вызывается из mousePressEvent, mouseMoveEvent и mouseReleaseEvent для стирания или перерисовки резиновой ленты. Она состоит из четырех вызовов функции update, которая устанавливает в очередь событие рисования для четырех небольших прямоугольных областей, составляющих изображение резиновой ленты (две вертикальные и две горизонтальные линии). Для рисования резиновой ленты в Qt предусмотрен класс QRubberBand, однако в нашем случае ручное кодирование обеспечило более тонкое управление.

189 void Plotter::refreshPixmap

190 {

191 pixmap = QPixmap(size);

192 pixmap.fill(this, 0, 0);

193 QPainter painter(&pixmap);

194 painter.initFrom(this);

195 drawGrid(&painter);

196 drawCurves(&painter);

197 update;

198 }

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже