[英]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.