QPainterPath绘制复合图形
QPainterPath绘制复合图形文章目录简述同心圆弧绘制的两种方法布尔运算路径绘制实现代码注意点失真现象内部线现象简述QPainterPath 类(绘图路径)提供了一个容器,用于绘图操作,可以创建和重用图形形状。绘图路径是由许多图形化的构建块组成的对象,例如:矩形、椭圆、直线和曲线。构建块可以加入在封闭的子路径中,例如:矩形或椭圆。封闭的路径的起点和终点是一致的,或者他们可以作为未封闭的子路径
QPainterPath绘制复合图形
文章目录
简述
QPainterPath 类(绘图路径)提供了一个容器,用于绘图操作,可以创建和重用图形形状。
绘图路径是由许多图形化的构建块组成的对象,例如:矩形、椭圆、直线和曲线。构建块可以加入在封闭的子路径中,例如:矩形或椭圆。封闭的路径的起点和终点是一致的,或者他们可以作为未封闭的子路径独立存在,如:直线和曲线。
QPainterPath 可以被填充、描绘轮廓、裁剪。
QPainterPath 提供了一组函数,可用于获取绘图路径及其元素的信息。除了可以使用 toReversed() 函数来改变元素的顺序外,还有几个函数将 QPainterPath 对象转换成一个多边形表示1。
同心圆弧绘制的两种方法
布尔运算
我们可以在之前的基础上加一些处理,从而实现一个圆弧2。
这种方法基本思想是采用布尔运算,从一个完整图形中裁剪一部分得到预期图形。
绘制效果如下:
路径绘制
绘制效果如下:
实现代码
Method 1是布尔运算,Method 2是路径绘制实现。
void MainWindow::slot_addConcentricArc()
{
QPainterPath path, subPath;
qreal startAngle, spanAngle, insideRadius, outsideRadius;
QPen pen(QColor(0,0,0,0));
QBrush brush(Qt::red);
int method = 0;
startAngle = 0;
spanAngle = 45;
insideRadius = 25;
outsideRadius = 50;
QRectF rect = QRectF(-outsideRadius, -outsideRadius, outsideRadius * 2, outsideRadius * 2);
QRectF subRect = QRectF(-insideRadius, -insideRadius, insideRadius * 2, insideRadius * 2);
switch (method)
{
case 0://Method 1
path.arcTo(rect, startAngle, spanAngle);
path.closeSubpath();
subPath.addEllipse(subRect);
path -= subPath;
break;
case 1://Method 2
//QPointF startPt, endPt;
path.moveTo(insideRadius, 0);
path.lineTo(outsideRadius, 0);
path.arcTo(rect, startAngle, spanAngle);
//startPt = path.currentPosition();
path.arcTo(subRect, spanAngle + startAngle, -spanAngle);
//endPt = path.currentPosition();
//path.lineTo(startPt);
break;
}
m_view->scene()->addPath(path, pen, brush);
}
注意点
1、使用布尔运算有个小缺陷,在半径较小时会出现失真现象。
2、使用路径绘制时会多一条内部线,由于QPen设置为透明并且有QBrush所以未凸显出该缺陷,可根据实际情况选择。
2、修改了代码,见上边注释部分;
失真现象
设置参数如下:
int method = 0;
startAngle = 0;
spanAngle = 45;
insideRadius = 1;
outsideRadius = 5;
内部线现象 已解决
设置参数如下:
QPen pen(Qt::black);
QBrush brush(Qt::red);
int method = 1;
startAngle = 0;
spanAngle = 45;
insideRadius = 1;
outsideRadius = 5;
原图:
修改后:
对于留言区的原点疑问,加粗边线后无原点显示。
附录
更多推荐
所有评论(0)