【问题标题】:How to make boundingRect() in an arc shape?如何使 boundingRect() 成为弧形?
【发布时间】:2016-05-04 10:56:22
【问题描述】:

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

}

【问题讨论】:

  • 不确定我是否理解您的问题,但boundingRect() 必须始终返回一个rect角度。没办法。不知道你需要这个做什么,但我想你需要找到另一种方法。如果您可以提供更多上下文,也许这里有人有一个很好的建议。
  • 这就是我使用shape();的方式,但是这个函数必须返回一个QPainterPath,而且我不知道如何用QPainterPath画一条弧线,就像我已经用画家。

标签: c++ qt


【解决方案1】:

你必须使用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);

}

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 1970-01-01
    • 2019-01-23
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多