Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

115 void Plotter::mouseReleaseEvent(QMouseEvent *event)

116 {

117 if ((event->button == Qt::LeftButton) &&

118 rubberBandIsShown) {

119 rubberBandIsShown = false;

120 updateRubberBandRegion;

121 unsetCursor;

122 QRect rect = rubberBandRect.normalized;

123 if (rect.width < 4 || rect.height < 4)

124 return;

125 rect.translate(-Margin, -Margin);

126 PlotSettings prevSettings = zoomStack[curZoom];

127 PlotSettings settings;

128 double dx = prevSettings.spanX / (width - 2 * Margin);

130 double dy = prevSettings.spanY / (height - 2 * Margin);

131 settings.minX = prevSettings.minX + dx * rect.left;

132 settings.maxX = prevSettings.minX + dx * rect.right;

133 settings.minY = prevSettings.maxY - dy * rect.bottom;

134 settings.maxY = prevSettings.maxY - dy * rect.top;

135 settings.adjust;

136 zoomStack.resize(curZoom + 1);

137 zoomStack.append(settings);

138 zoomIn;

139 }

140 }

Когда

пользователь отпускает левую кнопку мышки, мы стираем резиновую ленту и восстанавливаем стандартный курсор в виде стрелки. Если резиновая лента ограничивает прямоугольник, по крайней мере размером 4 × 4, мы изменяем масштаб изображения. Если резиновая лента выделяет прямоугольник меньшего размера, то, по-видимому, пользователь сделал щелчок мышкой по ошибке или просто перевел фокус, и поэтому мы ничего не делаем.

Программный код по изменению масштаба изображения немного сложен. Это вызвано тем, что мы работаем сразу с двумя системами координат: виджета и построителя графиков. Большинство выполняемых здесь действий связано с преобразованием координат объекта rubberBandRect (прямоугольник резиновой ленты) из системы координат виджета в систему координат построителя графиков. После выполнения преобразований мы вызываем функцию PlotSettings::adjust для округления чисел и определения разумного количества отметок по обеим осям. Эта ситуация отражена на рис. 5.10 и 5.11.

Рис. 5.10. Преобразование прямоугольника резиновой ленты из системы координат виджета в систему координат построителя графиков.

Рис. 5.11. Настройка прямоугольника резиновой ленты в системе координат построителя графиков и увеличение изображения.

Затем мы изменяем масштаб изображения. Это достигается путем помещения новых, только что рассчитанных настроек PlotSettings в вершину стека масштабов изображения и вызова функции zoomIn, которая выполняет всю остальную работу.

141 void Plotter::keyPressEvent(QKeyEvent *event)

142 {

143 switch (event->key) {

144 case Qt::Key_Plus:

145 zoomIn;

146 break;

147 case Qt::Key_Minus:

148 zoomOut;

149 break;

150 case Qt::Key_Left:

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

152 refreshPixmap;

153 break;

154 case Qt::Key_Right:

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.

Поделиться:
Популярные книги

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Кай из рода красных драконов

Бэд Кристиан
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Чапаев и пустота

Пелевин Виктор Олегович
Проза:
современная проза
8.39
рейтинг книги
Чапаев и пустота

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Ученик

Губарев Алексей
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Ученик

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5