QGraphicsitem运动时,重写的boundingRect被多次调用
时间: 2024-02-29 20:55:22 浏览: 94
QGraphicsItem的boundingRect()函数在每次需要重新绘制图形时会被调用,包括图形移动、旋转、缩放等任何变换。因此,如果您在boundingRect()函数中进行了一些复杂的计算,则每次变换都会导致这些计算被重复执行,从而降低程序的性能。
为了避免这种情况,您可以将boundingRect()的结果缓存起来,只有在需要重新计算时才进行计算。另外,您也可以重写QGraphicsItem的shape()函数,用于更精确地描述图形的形状,以提高图形的碰撞检测性能。
相关问题
boundingRect被多次调用怎么处理
当boundingRect()被多次调用时,可能会导致程序性能降低,因此需要考虑优化方法。以下是一些可行的优化方法:
1. 对于一些简单的图形,可以直接返回一个预定义的矩形,而不是每次都计算。对于复杂的图形,可以使用缓存技术,在boundingRect()函数中缓存计算结果,并在需要重新计算时再更新缓存。
2. 如果QGraphicsItem的形状比较简单,可以使用setShapeMode()函数来设置形状模式为QGraphicsItem::BoundingRectShape,这样在进行碰撞检测时,就只会调用boundingRect()一次,而不是多次调用。
3. 重写QGraphicsItem的shape()函数,用于更准确地描述图形的形状。shape()函数的返回值是一个QPainterPath对象,可以在其中描述图形的所有轮廓和空洞,从而提高碰撞检测的精度和效率。
4. 如果您使用的是Qt 5.11或更高版本,可以使用QGraphicsItem::ItemUsesExtendedStyleOption标志来告知Qt框架,您的图形将绘制在多个位置,从而避免不必要的boundingRect()调用。
qgraphicsitem 重写 不调用 paint
事件的解决方法可以有很多种,一种常见的方法是在 qgraphicsitem 的子类中重写 paint 方法,但有时候会出现不调用 paint 方法的情况。这可能是由于重写的 paint 方法没有被正确的调用,可以尝试在构造函数中设置 setFlag(QGraphicsItem::ItemUsesExtendedStyleOption) 以确保 paint 方法正确的调用。另外,也可以尝试在子类中重写 boundingRect 方法,确保正确的绘制区域。
阅读全文