Саммерфилд Марк
Шрифт:
Когда пользователь отпускает левую кнопку мышки, мы стираем резиновую ленту и восстанавливаем стандартный курсор в виде стрелки. Если резиновая лента ограничивает прямоугольник, по крайней мере размером 4 × 4, мы изменяем масштаб изображения. Если резиновая лента выделяет прямоугольник меньшего размера, то, по-видимому, пользователь сделал щелчок мышкой по ошибке или просто перевел фокус, и поэтому мы ничего не делаем.
Программный код по изменению масштаба изображения немного сложен. Это вызвано тем, что мы работаем сразу с двумя системами координат: виджета и построителя графиков. Большинство выполняемых здесь действий связано с преобразованием координат объекта rubberBandRect (прямоугольник резиновой ленты) из системы координат виджета в систему координат построителя графиков. После выполнения преобразований мы вызываем функцию PlotSettings::adjust для округления чисел и определения разумного количества отметок по обеим осям. Эта ситуация отражена на рис. 5.10 и 5.11.
Рис. 5.10. Преобразование прямоугольника резиновой ленты из системы координат виджета в систему координат построителя графиков.
Рис. 5.11. Настройка прямоугольника резиновой ленты в системе координат построителя графиков и увеличение изображения.
Затем мы изменяем масштаб изображения. Это достигается путем помещения новых, только что рассчитанных настроек PlotSettings в вершину стека масштабов изображения и вызова функции zoomIn, которая выполняет всю остальную работу.
Когда пользователь нажимает на клавиатуре какую-нибудь клавишу и фокус имеет построитель графиков Plotter, вызывается функция keyPressEvent. Мы ее переопределяем здесь, чтобы она реагировала на шесть клавиш: +, —, Up (вверх), Down (вниз), Left (влево) и Right (вправо). Если пользователь нажимает другую клавишу, мы вызываем реализацию этой функции из базового класса. Для простоты мы не учитываем ключи модификаторов Shift, Ctrl и Alt, доступ к которым осуществляется с помощью функции QKeyEvent::modifiers.
События колесика мышки возникают при повороте колесика мышки. В большинстве мышек предусматривается колесико для перемещения по вертикали, но некоторые мышки имеют также колесико для перемещения по горизонтали. Qt поддерживает оба вида колесиков. События колесика мышки передаются виджету, на котором находится фокус. Функция delta возвращает перемещение колесика, выраженное в восьмых долях градуса. Обычно шаг работы колесика мышки составляет 15 градусов. Здесь мы перемещаемся на заданное количество отметок, модифицируя верхний элемент стека масштабов изображений, и обновляем изображение, используя refreshPixmap.