QT 4: программирование GUI на С++
Шрифт:
При всяком изменении размера виджета Plotter Qt генерирует
Мы располагаем кнопки Zoom In и Zoom Out рядом, отделяя их 5-пиксельным промежутком от верхнего и правого краев родительского виджета.
Если бы нам захотелось оставить эти кнопки в верхнем левом углу, который имеет координаты (0, 0), мы бы просто переместили их туда в конструкторе Plotter. Но мы хотим, чтобы они находились в верхнем правом углу, координаты которого зависят от размеров виджета. По этой причине необходимо переопределить функцию resizeEvent и в ней устанавливать положение кнопок.
Мы не устанавливали положение каких-либо кнопок в конструкторе Plotter. Это сделано из-за того, что Qt всегда генерирует событие изменения размера до первого появления на экране виджета.
В качестве альтернативы переопределению функции resizeEvent и размещению дочерних виджетов «вручную» можно использовать менеджер компоновки (например, QGridLayout). При применении менеджеров компоновки это выполнить немного сложнее и такой подход потребовал бы больше ресурсов; с другой стороны, это дало бы элегантное решение компоновки справа налево, что необходимо для таких языков, как арабский и еврейский.
В конце мы вызываем функцию refreshPixmap для перерисовки пиксельной карты с новым размером.
Когда пользователь нажимает левую кнопку мышки, мы начинаем отображать на экране резиновую ленту. Для этого необходимо установить флажок rubberBandIsShown на значение true, инициализировать переменную—член rubberBandRect на значение текущей позиции курсора мышки, поставить в очередь событие рисования для вычерчивания резиновой ленты и изменить изображение курсора мышки на перекрестие.
Переменная rubberBandRect имеет
В Qt предусмотрено два способа управления формой курсора мышки:
• QWidget::setCursor устанавливает форму курсора, которая используется при его нахождении на конкретном виджете. Если для виджета курсор не задан, используется курсор родительского виджета. По умолчанию для виджета верхнего уровня назначается курсор в виде стрелки;
• QApplication::setOverrideCursor устанавливает форму курсора для всего приложения, отменяя формы курсоров отдельных виджетов до вызова функции restoreOverrideCursor.
В главе 4 мы вызывали функцию QApplication::setOverrideCursor с параметром Qt::WaitCursor для установки курсора приложения на стандартный курсор ожидания.
Когда пользователь перемещает курсор мышки с нажатой левой кнопкой, мы сначала вызываем функцию updateRubberBandRegion для постановки в очередь события рисования для перерисовки области, занятой резиновой лентой, затем пересчитываем значение переменной rubberBandRect для учета перемещения курсора и, наконец, второй раз вызываем функцию updateRubberBandRegion для перерисовки области, в которую переместилась резиновая лента. Это фактически приводит к стиранию резиновой ленты и ее вычерчиванию с новыми координатами.
Если пользователь перемещает мышку вверх или влево, может оказаться, что номинальный нижний правый угол резиновой ленты rubberBandRect выше или левее верхнего левого угла. В этом случае QRect будет иметь отрицательную ширину или высоту. В paintEvent нами использована функция QRect::normalized, которая настраивает координаты верхнего левого и нижнего правого углов для получения положительного значения ширины и высоты.