可视化面板:全方位事件过滤器劫持,彻底阻断Ctrl+滚轮的滚动穿透

This commit is contained in:
DXC
2026-05-08 16:42:04 +08:00
parent 33b6a918aa
commit ca12517d41

View File

@ -864,13 +864,13 @@ class ImageViewerWidget(QWidget):
self.original_btn.setToolTip("原始大小") self.original_btn.setToolTip("原始大小")
toolbar.addWidget(self.original_btn) toolbar.addWidget(self.original_btn)
self.hint_label = QLabel("💡 提示: Ctrl+滚轮 缩放 | 滚轮 上下移动 | 拖拽 平移") self.hint_label = QLabel("💡 提示: 按住 Ctrl+滚轮 可以实现放大缩小")
self.hint_label.setStyleSheet(""" self.hint_label.setStyleSheet("""
QLabel { QLabel {
color: #888888; color: #444444;
font-size: 12px; font-size: 14px;
font-weight: bold;
padding-left: 15px; padding-left: 15px;
font-style: italic;
} }
""") """)
toolbar.addWidget(self.hint_label) toolbar.addWidget(self.hint_label)
@ -892,6 +892,13 @@ class ImageViewerWidget(QWidget):
self.image_label.setStyleSheet("background-color: white;") self.image_label.setStyleSheet("background-color: white;")
self.scroll_area.setWidget(self.image_label) 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) layout.addWidget(self.scroll_area, 1)
status_layout = QHBoxLayout() status_layout = QHBoxLayout()
@ -960,21 +967,24 @@ class ImageViewerWidget(QWidget):
self.image_label.setPixmap(scaled_pixmap) self.image_label.setPixmap(scaled_pixmap)
self._pending_scale = None self._pending_scale = None
def wheelEvent(self, event): def eventFilter(self, obj, event):
"""鼠标滚轮缩放与滚动 - Ctrl+滚轮缩放,纯滚轮上下滚动""" from PyQt5.QtCore import QEvent, Qt
if event.modifiers() == Qt.ControlModifier:
delta = event.angleDelta().y() if event.type() == QEvent.Wheel:
if delta > 0: if event.modifiers() == Qt.ControlModifier:
if self.scale_factor < 5.0: if obj is self.scroll_area.viewport() or obj is self.image_label:
self.scale_factor = min(self.scale_factor * 1.1, 5.0) delta = event.angleDelta().y()
self.update_image_display() if delta > 0:
else: if getattr(self, 'scale_factor', 1.0) < 5.0:
if self.scale_factor > 0.1: self.scale_factor = min(self.scale_factor * 1.1, 5.0)
self.scale_factor = max(self.scale_factor / 1.1, 0.1) self.update_image_display()
self.update_image_display() else:
event.accept() if getattr(self, 'scale_factor', 1.0) > 0.1:
else: self.scale_factor = max(self.scale_factor / 1.1, 0.1)
super().wheelEvent(event) self.update_image_display()
return True
return super().eventFilter(obj, event)
def zoom_in(self): def zoom_in(self):
"""放大""" """放大"""