c++ 如何使boundingRect()成为弧形?

gab6jxml  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(133)

我的类继承自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);

}
xa9qqrwz

xa9qqrwz1#

你必须使用QPainterPath::arcTo,但你必须在弧的起点移动当前位置,否则弧将用一条线连接到当前位置。
要移动起点中的当前位置,可以使用QPainterPath::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);

}

相关问题