可视化面板:全方位事件过滤器劫持,彻底阻断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("原始大小")
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+滚轮缩放,纯滚轮上下滚动"""
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 self.scale_factor < 5.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 self.scale_factor > 0.1:
if getattr(self, 'scale_factor', 1.0) > 0.1:
self.scale_factor = max(self.scale_factor / 1.1, 0.1)
self.update_image_display()
event.accept()
else:
super().wheelEvent(event)
return True
return super().eventFilter(obj, event)
def zoom_in(self):
"""放大"""