diff --git a/src/gui/panels/visualization_panel.py b/src/gui/panels/visualization_panel.py index 601b5da..0c5300a 100644 --- a/src/gui/panels/visualization_panel.py +++ b/src/gui/panels/visualization_panel.py @@ -864,13 +864,13 @@ class ImageViewerWidget(QWidget): self.original_btn.setToolTip("原始大小") toolbar.addWidget(self.original_btn) - self.hint_label = QLabel("💡 提示: Ctrl+滚轮 缩放 | 滚轮 上下移动 | 拖拽 平移") + self.hint_label = QLabel("💡 提示: 按住 Ctrl+滚轮 可以实现放大缩小") self.hint_label.setStyleSheet(""" QLabel { - color: #888888; - font-size: 12px; + color: #444444; + font-size: 14px; + font-weight: bold; padding-left: 15px; - font-style: italic; } """) toolbar.addWidget(self.hint_label) @@ -892,6 +892,13 @@ class ImageViewerWidget(QWidget): self.image_label.setStyleSheet("background-color: white;") self.scroll_area.setWidget(self.image_label) + + # 全方位事件拦截:给所有可能触发滚轮的子组件全部挂载过滤器 + self.image_label.installEventFilter(self) + self.scroll_area.viewport().installEventFilter(self) + self.scroll_area.installEventFilter(self) + self.scroll_area.verticalScrollBar().installEventFilter(self) + self.scroll_area.horizontalScrollBar().installEventFilter(self) layout.addWidget(self.scroll_area, 1) status_layout = QHBoxLayout() @@ -960,21 +967,24 @@ class ImageViewerWidget(QWidget): self.image_label.setPixmap(scaled_pixmap) self._pending_scale = None - def wheelEvent(self, event): - """鼠标滚轮缩放与滚动 - Ctrl+滚轮缩放,纯滚轮上下滚动""" - if event.modifiers() == Qt.ControlModifier: - delta = event.angleDelta().y() - if delta > 0: - if self.scale_factor < 5.0: - self.scale_factor = min(self.scale_factor * 1.1, 5.0) - self.update_image_display() - else: - if self.scale_factor > 0.1: - self.scale_factor = max(self.scale_factor / 1.1, 0.1) - self.update_image_display() - event.accept() - else: - super().wheelEvent(event) + def eventFilter(self, obj, event): + from PyQt5.QtCore import QEvent, Qt + + if event.type() == QEvent.Wheel: + if event.modifiers() == Qt.ControlModifier: + if obj is self.scroll_area.viewport() or obj is self.image_label: + delta = event.angleDelta().y() + if delta > 0: + if getattr(self, 'scale_factor', 1.0) < 5.0: + self.scale_factor = min(self.scale_factor * 1.1, 5.0) + self.update_image_display() + else: + if getattr(self, 'scale_factor', 1.0) > 0.1: + self.scale_factor = max(self.scale_factor / 1.1, 0.1) + self.update_image_display() + return True + + return super().eventFilter(obj, event) def zoom_in(self): """放大"""