可视化面板:全方位事件过滤器劫持,彻底阻断Ctrl+滚轮的滚动穿透
This commit is contained in:
@ -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):
|
||||
"""放大"""
|
||||
|
||||
Reference in New Issue
Block a user