Parcourir la source

修复离开工位后残留最后一帧的问题

在停掉 RTSP 播放器前先 disconnect 所有信号连接
(frame_ready/first_frame_received/timeout),
避免跨线程 QueuedConnection 的 setPixmap 事件在
clear() 之后仍被执行,导致最后一帧重新显示。
lsfoo il y a 3 mois
Parent
commit
9921f7c872
1 fichiers modifiés avec 33 ajouts et 10 suppressions
  1. 33 10
      hookvision/main_window.py

+ 33 - 10
hookvision/main_window.py

@@ -696,13 +696,24 @@ class MainWindow(QMainWindow):
         player.frame_ready.connect(label.setPixmap)
         player.first_frame_received.connect(lambda: self._on_rtsp_retry_success(side))
         player.timeout.connect(lambda: self.on_player_timeout(label, player, side))
+        old = self.left_player if side == "left" else self.right_player
+        if old:
+            try:
+                old.frame_ready.disconnect()
+            except TypeError:
+                pass
+            try:
+                old.first_frame_received.disconnect()
+            except TypeError:
+                pass
+            try:
+                old.timeout.disconnect()
+            except TypeError:
+                pass
+            old.stop()
         if side == "left":
-            if self.left_player:
-                self.left_player.stop()
             self.left_player = player
         else:
-            if self.right_player:
-                self.right_player.stop()
             self.right_player = player
         player.start()
 
@@ -786,12 +797,24 @@ class MainWindow(QMainWindow):
         self._cancel_rtsp_retry("right")
         if bucket and self.voice_enabled:
             self._speak(f"到达{bucket.description}")
-        if self.left_player:
-            self.left_player.stop()
-            self.left_player = None
-        if self.right_player:
-            self.right_player.stop()
-            self.right_player = None
+        for player in (self.left_player, self.right_player):
+            if player is None:
+                continue
+            try:
+                player.frame_ready.disconnect()
+            except TypeError:
+                pass
+            try:
+                player.first_frame_received.disconnect()
+            except TypeError:
+                pass
+            try:
+                player.timeout.disconnect()
+            except TypeError:
+                pass
+            player.stop()
+        self.left_player = None
+        self.right_player = None
         if self.active_bucket:
             self.active_bucket.is_active = False
         self.active_bucket = bucket