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