Шаг 212.
Библиотека Qt.
Отсечения

    На этом шаге рассмотрим использование отсечения.

    Отсечения ограничивают вывод графики определенной областью (многоугольником или эллипсом). Если осуществляется попытка рисования за этими пределами, то оно будет невидимым. Установка прямоугольной области отсечения выполняется с помощью метода setClipRect(). Метод setClipRect() устанавливает прямоугольную область отсечения. Продемонстрируем отсечение фигуры эллипса прямоугольной областью (рис. 1).


Рис.1. Пример отсечения прямоугольной областью

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setClipRect(50, 50, 200, 100);
int k=0;
for(int i=0;i<3;i++)
{
    painter.setBrush(QBrush(Qt::blue));
    painter.setPen(QPen(Qt::green, 2));
    painter.drawEllipse(50*i+k, 50, 100, 200);
    k+=50;
    painter.setBrush(QBrush(Qt::green));
    painter.setPen(QPen(Qt::blue, 2));
    painter.drawEllipse(50*i+k, 50, 100, 200);
}

    Файлы приложения можно взять здесь.

    Более сложные области отсечения устанавливаются методами QPainter::setClipRegion() и QPainter::setClipPath().

    В метод setClipRegion() передается объект класса QRegion. В конструкторе класса можно задать область в виде прямоугольника или эллипса. Например, следующий вызов создаст прямоугольную область (рис. 1) с координатами левого верхнего угла (50, 50), а также шириной и высотой, равными 200 и 100 соответственно:

QRegion region(50, 50, 200, 100);

    Область отсечения в виде эллипса (рис. 2), вписанного в такой прямоугольник, создается следующим образом:


QRegion region (50, 50, 200, 100, QRegion::Ellipse);


Рис.2. Пример отсечения эллипсом

    В качестве области отсечения можно использовать и полигон, передав его в конструктор (рис. 3). Точки в полигоне можно установить при помощи оператора <<. Например:


Рис.3. Пример отсечения треугольником

QRegion region(QPolygon() << QPoint(50, 200)
                          << QPoint(100, 50)
                          << QPoint(200, 200));

    Объекты класса QRegion можно комбинировать друг с другом, создавая довольно сложные области, при помощи методов united(), intersected(), subtracted() и xored():

    Например (рис. 4):


Рис.4. Пример отсечения вычитанием

QRegion region1(50, 50, 200, 200);
QRegion region2(100, 100, 100, 100, QRegion::Ellipse);
QRegion region3 = region1.subtracted(region2);
painter.setClipRegion(region3);;

    На следующем шаге рассмотрим режим совмещения.




Предыдущий шаг Содержание Следующий шаг