Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

[Предыдущий: Урок 8] [Учебное пособие] [Следующий: Урок 10]

Урок 9 - С пушкой вы можете

Файлы:

Снимок экрана к Уроку 9

Следующий пример мы сделаем нагляднее нарисовав небольшую изящную пушку синего цвета. По сравнению с предыдущим уроком изменится только файл cannonfield.cpp.

Разберем программу строка за строкой

t9/cannonfield.cpp

 void CannonField::paintEvent(QPaintEvent * /* event */)
 {
     QPainter painter(this);

Мы начинаем всерьез использовать QPainter. Создадим рисовальщика, действующего на этом виджете.

     painter.setPen(Qt::NoPen);

Контур фигур, которые рисует QPainter, рисуются с помощью пера. Здесь мы установили его в значение Qt::NoPen, что означает отсутствие контура при рисовании.

     painter.setBrush(Qt::blue);

Когда QPainter заливает цветом прямоугольник, окружность или что-либо еще, он заливает фигуру используя кисть. Здесь мы установили сплошную синюю кисть. (Также мы можем использовать палитру.) Синяя кисть будет использоваться также при рисовании контуров фигур.

     painter.translate(0, rect().height());

Функция QPainter::translate() транслирует систему координат QPainter (т.е., передвигает ее на величину смещения). Здесь мы установили точку (0, 0) в верхний левый угол виджета. Размеры x и y остаются неизменными, т.е., все координаты y внутри виджета теперь отрицательные. (Дополнительную информацию о системе координат Qt смотрите в статье Система координат.)

     painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16);

Функция QPainter::drawPie() используя начальный угол и длину дуги рисует сектор, вписанный в заданный прямоугольник. Углы задаются в шестнадцатых частях градуса. Ноль градусов соответствует 3-часовой отметке. Направление рисования - против часовой стрелки. Здесь мы нарисовали четверть окружности в верхнем левом углу виджета. Сектор не имеет границы и заливается синим цветом.

     painter.rotate(-currentAngle);

Функция QPainter::rotate() вращает систему координат QPainter вокруг начала отсчета. Аргумент вращения float задается в градусах (а не в шестнадцатых долях градуса как было выше) и направлен по часовой стрелке. Здесь мы вращаем систему координат на currentAngle градусов против часовой стрелки.

     painter.drawRect(QRect(30, -5, 20, 10));

Функция QPainter::drawRect() рисует заданный прямоугольник. Нарисуем ствол пушки.

Часто бывает трудно представить себе результат рисования когда система координат была преобразована (транслирована, повернута, масштабирована или сдвинута) как это сделано выше.

В этом случае система координат сначала транслируется, а затем поворачивается. Если прямоугольник QRect(30, -5, 20, 10) нарисован в транслированной системе координат, то он будет выглядеть примерно так:

Пушка транслирована, но не повернута

Обратите внимание на то, что прямоугольник ограничен границей виджета CannonField. Когда мы поворачиваем систему координат, например на 60 градусов, прямоугольник будет повернут вокруг точки (0, 0), которая находится в верхнем левом углу поскольку мы транслировали систему координат. Результат выглядит так:

Пушка транслирована и повернута

Запуск приложения

При работе с ползунком соответственно изменяется и угол возвышения пушки.

Буква 'Q' в кнопке Quit теперь подчеркнута, а сочетание клавиш Alt+Q вызывает нажатие кнопки.

Домашнее задание

Установите другое перо вместо Qt::NoPen. Установите узорчатую (patterned) кисть.

Попробуйте в качестве текста кнопки "Q&uit" либо "Qu&it" вместо "&Quit". Что произойдет?

[Предыдущий: Урок 8] [Учебное пособие] [Следующий: Урок 10]


Copyright © 2008 Trolltech Торговые марки
Qt 4.3.5