@@ -192,59 +192,58 @@ def update_from_data(self, region_data: dict):
192192 # 保存选中状态
193193 was_selected = self .isSelected ()
194194
195- # 确保 region_data 包含所有必要的字段
196- # 如果新的 region_data 缺少某些字段,从旧的 self.region_data 中复制
197- if hasattr (self , 'region_data' ) and self .region_data :
198- # 合并旧数据和新数据,新数据优先
199- merged_data = self .region_data .copy ()
200- merged_data .update (region_data )
201- self .region_data = merged_data
202- else :
203- self .region_data = region_data
195+ # 确保 region_data 包含所有必要的字段
196+ # 如果新的 region_data 缺少某些字段,从旧的 self.region_data 中复制
197+ if hasattr (self , 'region_data' ) and self .region_data :
198+ # 合并旧数据和新数据,新数据优先
199+ merged_data = self .region_data .copy ()
200+ merged_data .update (region_data )
201+ self .region_data = merged_data
202+ else :
203+ self .region_data = region_data
204204
205- self .desktop_geometry = DesktopUIGeometry (self .region_data )
205+ self .desktop_geometry = DesktopUIGeometry (self .region_data )
206206
207- # lines是未旋转的世界坐标,需要转换为局部坐标
208- model_lines = self .desktop_geometry .lines
209- self .rotation_angle = self .desktop_geometry .angle
210- self .visual_center = QPointF (self .desktop_geometry .center [0 ], self .desktop_geometry .center [1 ])
207+ # lines是未旋转的世界坐标,需要转换为局部坐标
208+ model_lines = self .desktop_geometry .lines
209+ self .rotation_angle = self .desktop_geometry .angle
210+ self .visual_center = QPointF (self .desktop_geometry .center [0 ], self .desktop_geometry .center [1 ])
211211
212- # 在修改位置和旋转之前调用 prepareGeometryChange()
213- self .prepareGeometryChange ()
212+ # 在修改位置和旋转之前调用 prepareGeometryChange()
213+ self .prepareGeometryChange ()
214214
215- self .setPos (self .visual_center )
216- self .setRotation (self .rotation_angle )
215+ self .setPos (self .visual_center )
216+ self .setRotation (self .rotation_angle )
217217
218- # 转换为局部坐标: local = world - center
219- self .polygons = []
220- for i , line in enumerate (model_lines ):
221- local_poly = QPolygonF ()
222- for x , y in line :
223- local_poly .append (QPointF (x - self .visual_center .x (), y - self .visual_center .y ()))
224- self .polygons .append (local_poly )
218+ # 转换为局部坐标: local = world - center
219+ self .polygons = []
220+ for i , line in enumerate (model_lines ):
221+ local_poly = QPolygonF ()
222+ for x , y in line :
223+ local_poly .append (QPointF (x - self .visual_center .x (), y - self .visual_center .y ()))
224+ self .polygons .append (local_poly )
225225
226+ # 更新白框和绿框
227+ self ._update_frames_from_geometry (self .desktop_geometry )
226228
227- # 更新白框和绿框
228- self ._update_frames_from_geometry ( self . desktop_geometry )
229+ # 再次调用 prepareGeometryChange() 确保 shape() 缓存被清除
230+ self .prepareGeometryChange ( )
229231
230- # 再次调用 prepareGeometryChange() 确保 shape() 缓存被清除
231- self .prepareGeometryChange ()
232+ # 恢复选中状态
233+ if was_selected != self .isSelected ():
234+ self .setSelected (was_selected )
232235
233- # 恢复选中状态
234- if was_selected != self .isSelected ():
235- self .setSelected (was_selected )
236+ self .update ()
236237
237- self .update ()
238+ # 强制刷新场景空间索引 - 使用旧+新区域的并集
239+ if self .scene () and old_scene_rect is not None :
240+ from PyQt6 .QtWidgets import QGraphicsScene
241+ new_scene_rect = self .sceneBoundingRect ()
242+ # 合并旧和新的区域,确保空间索引完全更新
243+ update_rect = old_scene_rect .united (new_scene_rect )
244+ self .scene ().invalidate (update_rect , QGraphicsScene .SceneLayer .ItemLayer )
245+ self .scene ().update (update_rect )
238246
239- # 强制刷新场景空间索引 - 使用旧+新区域的并集
240- if self .scene () and old_scene_rect is not None :
241- from PyQt6 .QtWidgets import QGraphicsScene
242- new_scene_rect = self .sceneBoundingRect ()
243- # 合并旧和新的区域,确保空间索引完全更新
244- update_rect = old_scene_rect .united (new_scene_rect )
245- self .scene ().invalidate (update_rect , QGraphicsScene .SceneLayer .ItemLayer )
246- self .scene ().update (update_rect )
247-
248247 except (RuntimeError , AttributeError ) as e :
249248 # Item可能在更新过程中被删除
250249 print (f"[RegionTextItem] Warning: update_from_data failed: { e } " )
0 commit comments