簡體   English   中英

如何使boundingRect()呈弧形?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM