[英]How to make boundingRect() in an arc shape?
我的课从QGraphicsItem继承。 我用painter-> drawArc对其进行绘制,并且希望对该对象进行相同的绑定,但是QpainterPath不具有painter这样的功能。 arcTo是不一样的,因为它的中心线。
代码(宽度是笔的宽度,因此碰撞发生在圆弧的外部边界上。):
QRectF Circle::boundingRect() const
{
QRectF rect( -radius, -radius, radius*2, radius*2);
return rect;
}
QPainterPath Circle::shape() const
{
QPainterPath path;
path.arcTo(-radius-width, -radius-width, (radius+width)*2, (radius+width)*2, startAngle/16, spanAngle/16);
return path;
}
void Circle::paint(QPainter * painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QPen pen;
pen.setCapStyle(Qt::FlatCap);
pen.setWidth(width);
painter->setPen(pen);
painter->drawArc(boundingRect(), startAngle, spanAngle);
}
您必须使用QPaintePath::arcTo
,但是必须在圆弧的起点移动当前位置,否则圆弧将通过一条线连接到当前位置。
要在起点上移动当前位置,可以使用QPaintePath::arcMoveTo
例
QPainterPath pp;
pp.arcMoveTo(rect, startAngle);
pp.arcTo(rect, startAngle, spanAngle);
还可以考虑使用QPainterPathStroker
赋予形状厚度。 并且还将笔的宽度添加到边界矩形
例:
QRectF Circle::boundingRect() const
{
return QRectF(-radius - width, -radius - width, (radius + width) * 2, (radius + width) * 2);
}
QPainterPath Circle::shape() const
{
QRectF rect(-radius, -radius, radius * 2, radius * 2);
QPainterPath path;
path.arcMoveTo(rect, startAngle / 16);
path.arcTo(rect, startAngle / 16, spanAngle / 16);
QPainterPathStroker pps;
pps.setCapStyle(Qt::FlatCap);
pps.setWidth(width);
return pps.makeStroke(path);
}
void Circle::paint(QPainter * painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QPen pen;
pen.setCapStyle(Qt::FlatCap);
pen.setWidth(width);
painter->setPen(pen);
QRectF rect(-radius, -radius, radius * 2, radius * 2);
painter->drawArc(rect, startAngle, spanAngle);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.