На этом шаге рассмотрим использование отсечения.
Отсечения ограничивают вывод графики определенной областью (многоугольником или эллипсом). Если осуществляется попытка рисования за этими пределами, то оно будет невидимым. Установка прямоугольной области отсечения выполняется с помощью метода 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);;
На следующем шаге рассмотрим режим совмещения.