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

Мы не устанавливали положение каких-либо кнопок в конструкторе Plotter. Это сделано из-за того, что Qt всегда генерирует событие изменения размера до первого появления на экране виджета.

В качестве альтернативы переопределению функции resizeEvent и размещению дочерних виджетов «вручную» можно использовать менеджер компоновки (например, QGridLayout). При применении менеджеров компоновки это выполнить немного сложнее и такой подход потребовал бы больше ресурсов; с другой стороны, это дало бы элегантное решение компоновки справа налево, что необходимо для таких языков, как арабский и еврейский.

В конце мы вызываем функцию refreshPixmap для перерисовки пиксельной карты с новым размером.

093 void Plotter::mousePressEvent(QMouseEvent *event)

094 {

095 QRect rect(Margin, Margin,

096 width - 2 * Margin, height - 2 * Margin);

097 if (event->button == Qt::LeftButton) {

098 if (rect.contains(event->pos)) {

099 rubberBandIsShown = true;

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 для перерисовки области, в которую переместилась резиновая лента. Это фактически приводит к стиранию резиновой ленты и ее вычерчиванию с новыми координатами.

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