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

Рис. 8.5. Примеры геометрических фигур.

Давайте рассмотрим несколько примеров. Ниже приводится программный код для вычерчивания эллипса, показанного на рис. 8.5 (а):

QPainter painter(this);

painter.setRenderHint(QPainter::Antialiasing, true);

painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));

painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));

painter.drawEllipse(80, 80, 400, 240);

Вызов setRenderHint включает режим сглаживания линий, указывая QPainter на необходимость использования по краям цветов различной интенсивности, чтобы уменьшить визуальное искажение, которое обычно заметно, когда края фигуры представляются пикселями. В результате края воспринимаются более ровными на тех платформах и устройствах, которые поддерживают эту функцию.

Ниже приводится программный код для вычерчивания сектора эллипса, показанного на рис. 8.5 (б):

QPainter painter(this);

painter.setRenderHint(QPainter::Antialiasing, true);

painter.setPen(QPen(Qt::black, 15, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin));

painter.setBrush(QBrush(Qt::blue, Qt::DiagCrossPattern));

painter.drawPie(80, 80, 400, 240, 60 * 16, 270 * 16);

Два последних аргумента функции drawPie задаются в шестнадцатых долях градуса.

Ниже приводится программный код для вычерчивания кривой Безье третьего порядка, показанной на рис. 8.5 (в):

QPainter painter(this);

painter.setRenderHint(QPainter::Antialiasing, true);

QPainterPath path;

path.moveTo(80, 320);

path.cubicTo(200, 80, 320, 80, 480, 320);

painter.setPen(QPen(Qt::black, 8));

painter.drawPath(path);

Класс QPainterPath может определять произвольные фигуры векторной графики, соединяя друг с другом основные графические элементы: прямые линии, эллипсы, многоугольники, дуги, кривые Безье второго и третьего порядка и другие цепочки графических элементов рисовальщика (painter paths). Такие цепочки являются законченными элементарными рисунками в том смысле, что любая фигура или любая комбинация фигур может быть представлена в виде некоторой цепочки графических элементов.

Цепочка графических элементов определяет контур, а область внутри контура можно заполнить какой-нибудь кистью. В примере, представленном на рис. 8.5 (в), мы не задавали кисть, поэтому нарисован только контур.

В трех представленных выше примерах используются встроенные шаблоны кисти (Qt::SolidPattern, Qt::DiagCrossPattern и Qt::NoBrush). В современных приложениях градиентные заполнители являются популярной альтернативой однородным заполнителям. Цветовые градиенты основаны на интерполяции цветов, обеспечивающей сглаженные переходы между двумя или более цветами. Они часто применяются для получения эффекта трехмерности изображения, например стиль Plastique использует цветовые градиенты при воспроизведении кнопок QPushButton.

Qt поддерживает три типа цветовых градиентов: линейный, конический и радиальный. В примере таймера духовки, который приводится в следующем разделе, в одном виджете используется комбинация всех трех типов градиентов для того, чтобы изображение выглядело реалистически.

Рис. 8.6. Кисти QPainter с цветовыми градиентами.

• Линейные градиенты определяются двумя контрольными точками и рядом «цветовых отметок» на линии, соединяющей эти точки. Например, линейный градиент на рис. 8.6 создан при помощи следующего программного кода:

QLinearGradient gradient(50, 100, 300, 350);

gradient.setColorAt(0.0, Qt::white);

gradient.setColorAt(0.2, Qt::green);

gradient.setColorAt(1.0, Qt::black);

Мы задали три цвета в трех разных позициях между двумя контрольными точками. Позиции представляются в виде чисел с плавающей точкой в диапазоне между 0 и 1, где 0 соответствует первой контрольной точке, а 1 — последней контрольной точке. Цвет между этими позициями интерполируется.

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