QGraphicsItem的setClipRect 和 boundingRect函数

在 Qt 的 QGraphicsItem 类中,setClipRect 和 boundingRect 都有特定的用途,并且与图形项的渲染和几何属性密切相关。
1、boundingRect():
boundingRect 是一个纯虚函数,在 QGraphicsItem 类中声明,需要在子类中进行实现。它返回一个 QRectF 对象,该对象定义了图形项的边界。这个边界框是一个矩形,它紧密地包围着图形项的形状或内容。
当你重写 boundingRect 函数时,你应该返回一个足够大的矩形,以包含图形项的所有可见部分。Qt 使用这个边界框来确定何时需要重绘图形项,以及如何处理碰撞检测等。
例如:

QRectF MyGraphicsItem::boundingRect() const
 {  
    // 返回紧密包围图形项内容的矩形  
    return QRectF(0, 0, width, height);  
}

2、setClipRect():
setClipRect 方法用于设置图形项的裁剪矩形。裁剪矩形是一个限制图形项绘制区域的矩形。只有位于这个矩形内的部分才会被绘制。这可以用于优化性能,特别是在绘制大型或复杂的图形项时,你可能只对某个特定区域感兴趣。使用 setClipRect 时,任何超出指定矩形的绘制都会被裁剪掉,不会显示在屏幕上。
例如:

void MyGraphicsItem::setClipRect(const QRectF &rect)
 {  
    setClip(true); // 启用裁剪  
    setClipRect(rect); // 设置裁剪矩形  
}

在使用 setClipRect() 设置裁剪矩形之前,不一定要先调用 setClip(true)。setClip(true) 用于启用裁剪功能,而 setClipRect() 用于设置具体的裁剪区域。在 Qt 5 之前的Qt 的 QGraphicsItem 类中,裁剪功能默认是禁用的(即 setClip(false))。如果你直接调用 setClipRect() 而没有先调用 setClip(true),裁剪功能将不会被启用,即使你设置了裁剪矩形,也不会有任何裁剪效果。因此,为了启用裁剪并设置裁剪区域,你需要确保先调用 setClip(true)。
然而,从 Qt 5 开始,QGraphicsItem 的行为有所改变。现在,当你调用 setClipRect() 时,如果裁剪区域是有效的(即不是空的并且与项目的边界框有交集),裁剪功能会自动启用,即使你之前没有显式调用 setClip(true)。这意味着在 Qt 5 及更高版本中,你通常可以只调用 setClipRect() 来设置裁剪区域,而不需要先调用 setClip(true)。
但是,为了代码的清晰性和可维护性,如果你打算启用裁剪并设置裁剪区域,显式地先调用 setClip(true) 再调用 setClipRect() 是一个好的做法。这样,你的代码意图就更加明显,其他开发者也能更容易地理解你的代码逻辑。
总结来说,虽然从 Qt 5 开始,调用 setClipRect() 时裁剪功能可能会自动启用,但显式地先调用 setClip(true) 再设置裁剪区域是一个好的编程习惯,可以确保裁剪功能被正确启用,并且代码意图更加明确。

注意事项
1.boundingRect 定义了图形项的整体边界,而 setClipRect 定义了绘制时的裁剪区域。
2.Qt5之前默认情况下,QGraphicsItem 不进行裁剪。你需要显式调用 setClip(true) 来启用裁剪。
3.裁剪矩形可以小于或等于边界框,但不能大于边界框。如果尝试设置一个大于边界框的裁剪矩形,Qt 可能会忽略这个设置或产生不可预测的结果。
4.裁剪通常用于优化性能,但也要小心使用,因为它会改变图形项的视觉表现。确保你了解裁剪的效果,并且它符合你的应用需求。
这两个方法通常在自定义 QGraphicsItem 子类时一起使用,以确保图形项的正确绘制和性能优化。

注意注意
如果想要改变item的boundingRect或setClipRect ,那么需要在改变之前就调用prepareGeometryChange函数来通知场景进行更新(更新内部二叉树的索引),否则的话渲染瑕疵会保留在视图中,也就是说之前绘制的图形有部分可能不会被刷新。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值