繁体   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