最近使用Qt作为绘图引擎时,在使用clipPath的过程中遇到了一些问题。
1、Qt的裁剪原理是每次setClipPath都默认对已存在的path进行替换
2、如果需要实现多边形内环的裁剪,即扣岛,需要将多边形外环、内环都设置在一个path里面,然后裁剪类型设置为Qt::ClipOperation::IntersectClip
示例如下:
void QtCanvas::clip(Polygon* polygon)
{
_canvasPtr->setClipping(true);
QPainterPath path;
QPolygon out_polygon;
auto outter_points = polygon->exteriorRing()->points();
auto outter_points_count = outter_points->pointCount();
for(int i = 0; i < outter_points_count; ++i)
{
const dan::SGPoint& point = outter_points->point(i);
out_polygon.append(QPoint(point.x(), point.y()));
}
path.addPolygon(out_polygon);
int inner_clip_count = polygon->numInteriorRings();
for(int o = 0; o < inner_clip_count; ++o)
{
auto inner_ring = polygon->interiorRing(o)->points();
auto point_count = inner_ring->pointCount();
if(point_count == 0)
{
continue;
}
QPolygon qPolygon;
for(int i = 0; i < point_count; ++i)
{
const dan::SGPoint& point = inner_ring->point(i);
qPolygon.append(QPoint(point.x(), point.y()));
}
path.addPolygon(qPolygon);
}
auto clip = Qt::ClipOperation::IntersectClip;
_canvasPtr->setClipPath(path, clip);
}