2727class ZoomableGraphicsView (QGraphicsView ):
2828 def __init__ (self , parent = None ):
2929 super ().__init__ (parent )
30-
30+
3131 # 初始化视图设置
3232 self ._setup_view ()
3333 self ._setup_scene ()
3434 self ._setup_interaction ()
3535 self ._setup_indicators ()
36-
36+
3737 # 初始化参数
3838 self ._zoom_factor = 1.0
3939 self .min_zoom = 0.1
@@ -67,7 +67,7 @@ def _setup_scene(self):
6767 self .scene = QGraphicsScene (self )
6868 self .scene .setSceneRect (- 1e6 , - 1e6 , 2e6 , 2e6 ) # 超大场景范围
6969 self .setScene (self .scene )
70-
70+
7171 self .pixmap_item = QGraphicsPixmapItem ()
7272 self .pixmap_item .setTransformationMode (Qt .SmoothTransformation )
7373 self .pixmap_item .setShapeMode (QGraphicsPixmapItem .BoundingRectShape )
@@ -92,14 +92,14 @@ def _setup_indicators(self):
9292 self .center_indicator .setVisible (False )
9393 self .scene .addItem (self .center_indicator )
9494
95- def update_image (self , pixmap : QPixmap ):
96- """更新图像并自适应视图"""
95+ def update_image (self , pixmap : QPixmap , svg_bytes : bytes = b'' ):
96+ """更新图像并自适应视图(svg_bytes 参数由方案B使用,此处忽略) """
9797 self .pixmap_item .setPixmap (pixmap )
9898 self ._center_pixmap (pixmap )
9999 if self .fisrt_refresh :
100100 self .fisrt_refresh = False
101101 self .fit_to_view ()
102-
102+
103103 def _center_pixmap (self , pixmap : QPixmap ):
104104 """居中放置图元"""
105105 self .pixmap_item .setPos (- pixmap .width ()/ 2 , - pixmap .height ()/ 2 )
@@ -120,7 +120,7 @@ def wheelEvent(self, event: QWheelEvent):
120120 zoom_in = event .angleDelta ().y () > 0
121121 factor = 1.25 if zoom_in else 0.8
122122 new_zoom = self ._zoom_factor * factor
123-
123+
124124 # 应用缩放限制
125125 if self .min_zoom <= new_zoom <= self .max_zoom :
126126 self .scale (factor , factor )
@@ -142,7 +142,7 @@ def keyPressEvent(self, event: QKeyEvent):
142142 new_zoom = self ._zoom_factor * factor
143143
144144 # 应用缩放限制
145- if self .min_zoom <= new_zoom <= self .max_zoom :
145+ if self .min_zoom <= new_zoom <= self .max_zoom :
146146 self .scale (factor , factor )
147147 self ._zoom_factor = new_zoom
148148 return
@@ -156,9 +156,9 @@ def mousePressEvent(self, event: QMouseEvent):
156156 self .dragging = True
157157 self .last_mouse_pos = event .pos ()
158158 self .setCursor (Qt .ClosedHandCursor )
159-
159+
160160 super ().mousePressEvent (event )
161-
161+
162162 def mouseDoubleClickEvent (self , event : QMouseEvent ):
163163 """鼠标双击事件处理(增强版)"""
164164 if event .button () == Qt .RightButton :
@@ -167,7 +167,7 @@ def mouseDoubleClickEvent(self, event: QMouseEvent):
167167 return
168168 elif event .button () == Qt .LeftButton :
169169 event .accept ()
170- factor = 2
170+ factor = 1.25
171171 new_zoom = self ._zoom_factor * factor
172172
173173 # 应用缩放限制
@@ -183,13 +183,13 @@ def mouseMoveEvent(self, event: QMouseEvent):
183183 if self .dragging :
184184 delta = event .pos () - self .last_mouse_pos
185185 self .last_mouse_pos = event .pos ()
186-
186+
187187 # 更新滚动条实现拖拽
188188 self .horizontalScrollBar ().setValue (
189189 self .horizontalScrollBar ().value () - delta .x ())
190190 self .verticalScrollBar ().setValue (
191191 self .verticalScrollBar ().value () - delta .y ())
192-
192+
193193 super ().mouseMoveEvent (event )
194194
195195 def mouseReleaseEvent (self , event : QMouseEvent ):
@@ -206,10 +206,10 @@ def _fit_and_center_animation(self):
206206
207207 # 先执行自适应调整
208208 self .fit_to_view ()
209-
209+
210210 # 获取最终场景中心坐标
211211 final_center = self .pixmap_item .sceneBoundingRect ().center ()
212-
212+
213213 # 创建组合动画
214214 self ._create_center_animation (final_center )
215215
@@ -218,14 +218,14 @@ def _create_center_animation(self, target_center: QPointF):
218218 # 平移动画
219219 anim_h = QPropertyAnimation (self .horizontalScrollBar (), b"value" )
220220 anim_v = QPropertyAnimation (self .verticalScrollBar (), b"value" )
221-
221+
222222 # 缩放动画
223223 current_zoom = self ._zoom_factor
224224 anim_zoom = QPropertyAnimation (self , b"zoom_factor" )
225225 anim_zoom .setDuration (400 )
226226 anim_zoom .setStartValue (current_zoom )
227227 anim_zoom .setEndValue (1.0 ) # 自适应后的标准缩放值
228-
228+
229229 # 配置动画参数
230230 for anim in [anim_h , anim_v ]:
231231 anim .setDuration (400 )
@@ -234,19 +234,19 @@ def _create_center_animation(self, target_center: QPointF):
234234 # 计算目标滚动值
235235 view_center = self .mapToScene (self .viewport ().rect ().center ())
236236 delta = target_center - view_center
237-
237+
238238 # 设置动画参数
239239 anim_h .setStartValue (self .horizontalScrollBar ().value ())
240240 anim_h .setEndValue (self .horizontalScrollBar ().value () + delta .x ())
241-
241+
242242 anim_v .setStartValue (self .verticalScrollBar ().value ())
243243 anim_v .setEndValue (self .verticalScrollBar ().value () + delta .y ())
244-
244+
245245 # 启动动画
246246 anim_zoom .start ()
247247 anim_h .start ()
248248 anim_v .start ()
249-
249+
250250 # 显示指示器
251251 self .center_indicator .setPos (target_center )
252252 self .center_indicator .setVisible (True )
0 commit comments