Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

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

Шрифт:

100 rubberBandRect.setTopLeft(event->pos);

101 rubberBandRect.setBottomRight(event->pos);

102 updateRubberBandRegion;

103 setCursor(Qt::CrossCursor);

104 }

105 }

106 }

Когда пользователь нажимает левую кнопку мышки, мы начинаем отображать на экране резиновую ленту. Для этого необходимо установить флажок rubberBandIsShown на значение true, инициализировать переменную—член rubberBandRect на значение текущей позиции курсора мышки, поставить в очередь событие рисования для вычерчивания резиновой ленты и изменить изображение курсора мышки на перекрестие.

Переменная rubberBandRect имеет тип QRect. Объект QRect может задаваться либо четырьмя параметрами (x, у, w, h), где (x, у) является позицией верхнего левого угла и w × h определяет размеры четырехугольника, либо парой точек верхнего левого и нижнего правого углов. Здесь мы используем формат с парой точек. То место, где пользователь первый раз щелкнул мышкой, становится верхним левым углом, а текущая позиция курсора определяет позицию нижнего правого угла. Затем мы вызываем updateRubberBandRegion для принудительной перерисовки (небольшой) области, покрываемой резиновой лентой.

В Qt предусмотрено два способа управления формой курсора мышки:

• QWidget::setCursor устанавливает форму курсора, которая используется при его нахождении на конкретном виджете. Если для виджета курсор не задан, используется курсор родительского виджета. По умолчанию для виджета верхнего уровня назначается курсор в виде стрелки;

• QApplication::setOverrideCursor устанавливает форму курсора для всего приложения, отменяя формы курсоров отдельных виджетов до вызова функции restoreOverrideCursor.

В главе 4 мы вызывали функцию QApplication::setOverrideCursor с параметром Qt::WaitCursor для установки курсора приложения на стандартный курсор ожидания.

107 void Plotter::mouseMoveEvent(QMouseEvent *event)

108 {

109 if (rubberBandIsShown) {

110 updateRubberBandRegion;

111 rubberBandRect.setBottomRight(event->pos);

112 updateRubberBandRegion;

113 }

114 }

Когда пользователь перемещает курсор мышки с нажатой левой кнопкой, мы сначала вызываем функцию updateRubberBandRegion для постановки в очередь события рисования для перерисовки области, занятой резиновой лентой, затем пересчитываем значение переменной rubberBandRect для учета перемещения курсора и, наконец, второй раз вызываем функцию updateRubberBandRegion для перерисовки области, в которую переместилась резиновая лента. Это фактически приводит к стиранию резиновой ленты и ее вычерчиванию с новыми координатами.

Если пользователь перемещает мышку вверх или влево, может оказаться, что номинальный нижний правый угол резиновой ленты rubberBandRect выше или левее верхнего левого угла. В этом случае QRect будет иметь отрицательную ширину или высоту. В paintEvent нами использована функция QRect::normalized, которая настраивает координаты верхнего левого и нижнего правого углов для получения положительного значения ширины и высоты.

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;

  • Читать дальше
  • 1
  • ...
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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