自定义QGraphicsItem调用power方法后界面无变化,求问题排查
问题分析与修复
核心问题:boundingRect范围错误
你的boundingRect()返回的矩形范围远小于实际绘制的图形区域,导致调用self.update()时,Qt仅刷新了这个过小的区域,而实际的旋转正方形完全不在该刷新范围内,因此界面看不到状态变化。
原boundingRect()的宽高仅为25 + self.bordersize,但你绘制的是50x50的正方形,旋转45度后,它的外接矩形边长约为70.71(50×√2),远大于当前设置的尺寸。虽然当前的boundingRect包含了文字区域,但图形区域完全未被覆盖。
修复步骤
1. 修正boundingRect()方法
重新计算能完全包含旋转后正方形和文字的矩形范围:
import math def boundingRect(self): square_size = 50 # 计算50x50正方形旋转45度后的外接矩形半长 rotated_half = square_size * math.sqrt(2) / 2 # 加上边框的偏移量 half_size = rotated_half + self.bordersize / 2 # 文字绘制在y=-70的位置,确定顶部边界 text_top = -70 - self.bordersize / 2 # 总高度包含文字区域和图形区域 total_height = 70 + rotated_half + self.bordersize return QtCore.QRectF(-half_size, text_top, half_size * 2, total_height)
2. 可选:直接指定update区域(不推荐,但可临时验证)
如果不想修改boundingRect,也可以在power()方法里明确指定要刷新的实际区域:
def power(self): self._on = not self._on # 刷新包含旋转正方形和文字的足够大的区域 self.update(QtCore.QRectF(-40, -75, 80, 80)) print(f'power changed to {self._on}')
推荐优先修正boundingRect,因为它是QGraphicsItem的核心属性,影响碰撞检测、视图裁剪等多个逻辑。
验证效果
修改后调用power()方法,Qt会正确刷新包含图形的区域,你就能看到正方形在灰色(#626262)和绿色(#32FF62)之间切换。
内容的提问来源于stack exchange,提问作者Victor Modamio
相关产品推荐
相关产品推荐

