def mouseMoveEvent(self, ev): lpos = ev.position() if hasattr(ev, 'position') else ev.localPos() if self.lastMousePos is None: self.lastMousePos = lpos delta = Point(lpos - self.lastMousePos) self.lastMousePos = lpos super().mouseMoveEvent(ev) if not self.mouseEnabled: return self.sigSceneMouseMoved.emit(self.mapToScene(lpos)) if self.clickAccepted: ## Ignore event if an item in the scene has already claimed it. return if ev.buttons() == QtCore.Qt.MouseButton.RightButton: delta = Point(fn.clip_scalar(delta[0], -50, 50), fn.clip_scalar(-delta[1], -50, 50)) scale = 1.01 ** delta self.scale(scale[0], scale[1], center=self.mapToScene(self.mousePressPos)) self.sigDeviceRangeChanged.emit(self, self.range) elif ev.buttons() in [QtCore.Qt.MouseButton.MiddleButton, QtCore.Qt.MouseButton.LeftButton]: ## Allow panning by left or mid button. px = self.pixelSize() tr = -delta * px self.translate(tr[0], tr[1]) self.sigDeviceRangeChanged.emit(self, self.range)
时间: 2024-02-14 10:22:15 浏览: 180
这是 `GraphicsView` 类的 `mouseMoveEvent` 方法的实现。该方法用于处理鼠标移动事件。
在该方法中,首先获取鼠标位置 `lpos`,并计算出与上一次鼠标位置的偏移量 `delta`。然后,使用 `mapToScene()` 方法将 `lpos` 转换为场景坐标,并通过 `sigSceneMouseMoved` 信号发射鼠标移动事件。
接下来,根据鼠标按键的状态,执行不同的操作。如果鼠标右键被按下,则缩放视图;如果鼠标左键或中键被按下,则平移视图。
在缩放操作中,将 `delta` 限制在 [-50, 50] 的范围内,并将其转换为缩放因子 `scale`,然后使用 `scale()` 方法缩放视图。
在平移操作中,将 `delta` 乘以像素大小 `px`,得到平移距离 `tr`,然后使用 `translate()` 方法平移视图。
最后,使用 `sigDeviceRangeChanged` 信号发射设备范围更改事件,将当前视图范围 `self.range` 作为参数传递给该信号。
相关问题
from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class GraphicsView(QGraphicsView): def init(self, parent=None): super(GraphicsView, self).init(parent) self.setDragMode(QGraphicsView.RubberBandDrag) def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.origin = event.pos() self.rubberBand = QRubberBand(QRubberBand.Rectangle, self) self.rubberBand.setGeometry(QRect(self.origin, QSize())) self.rubberBand.setStyleSheet("background-color: rgba(255, 0, 0, 50);") self.rubberBand.show() super(GraphicsView, self).mousePressEvent(event) def mouseMoveEvent(self, event): if self.rubberBand.isVisible(): self.rubberBand.setGeometry(QRect(self.origin, event.pos()).normalized()) super(GraphicsView, self).mouseMoveEvent(event) def mouseReleaseEvent(self, event): if event.button() == Qt.LeftButton: self.rubberBand.hide() rect = self.viewport().rect().intersected(self.rubberBand.geometry()) rect_mapped = self.mapToScene(rect).boundingRect() print(rect_mapped) super(GraphicsView, self).mouseReleaseEvent(event) class MainWindow(QMainWindow): def init(self): super().init() self.graphics_view = GraphicsView(self) self.scene = QGraphicsScene(self.graphics_view) self.graphics_view.setScene(self.scene) self.image = QImage("E:/123.bmp") self.pixmap = QPixmap.fromImage(self.image) self.scene.addPixmap(self.pixmap) self.setCentralWidget(self.graphics_view) if name == 'main': import sys app = QApplication(sys.argv) window = MainWindow() window.setGeometry(500, 200, 800, 600) window.show() sys.exit(app.exec_()) 在这个代码上,增加滑动滚轮可根据鼠标位置进行放大缩小
你可以在 GraphicsView 类中重新实现 wheelEvent() 方法,来处理鼠标滚轮事件,并根据鼠标位置进行放大缩小。以下是代码示例:
```python
class GraphicsView(QGraphicsView):
def __init__(self, parent=None):
super(GraphicsView, self).__init__(parent)
self.setDragMode(QGraphicsView.RubberBandDrag)
self.setRenderHint(QPainter.Antialiasing)
def wheelEvent(self, event):
# 获取当前鼠标位置
mouse_pos = event.pos()
# 获取当前视图的中心点
view_center = self.viewport().rect().center()
# 将鼠标位置转换为场景坐标系下的位置
scene_pos = self.mapToScene(mouse_pos)
# 计算缩放因子
zoom_factor = 1.2 if event.angleDelta().y() > 0 else 1 / 1.2
# 缩放视图
self.scale(zoom_factor, zoom_factor)
# 将视图中心点移动到鼠标位置
view_center_after = self.mapFromScene(scene_pos).toPoint()
delta = view_center_after - mouse_pos
self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - delta.x())
self.verticalScrollBar().setValue(self.verticalScrollBar().value() - delta.y())
```
在这个示例中,我们首先获取当前鼠标的位置,然后获取当前视图的中心点。接着将鼠标位置转换为场景坐标系下的位置,然后计算缩放因子。在缩放视图之后,我们将视图中心点移动到鼠标位置上,以达到缩放的效果。
# GRIPS top_left = QSizeGrip(self.wi.top_left) top_right = QSizeGrip(self.wi.top_right) # RESIZE TOP def resize_top(event): delta = event.pos() height = max(self.parent.minimumHeight(), self.parent.height() - delta.y()) geo = self.parent.geometry() geo.setTop(geo.bottom() - height) self.parent.setGeometry(geo) event.accept() self.wi.top.mouseMoveEvent = resize_top
这也是一个 Python 代码段,它是在 PyQt 库中使用的。这段代码的作用是实现在窗口顶部拖动改变窗口大小的功能。
首先,它使用 QSizeGrip 类创建了两个大小调整控件,分别位于窗口的左上角和右上角(top_left 和 top_right)。
然后,定义了一个名为 resize_top 的函数,该函数会在拖动窗口顶部时调用。在该函数中,首先获取当前鼠标位置相对于窗口的偏移量 delta,然后计算出新窗口的高度。这里使用了 max() 函数来确保新窗口的高度不小于窗口的最小高度。接下来,使用 setTop() 方法设置窗口的顶部位置,使得窗口的高度随着鼠标拖动而改变。最后,使用 setGeometry() 方法将新的窗口大小应用到窗口上。
最后一行代码是将 resize_top 函数设置为窗口顶部的鼠标移动事件处理函数,以实现窗口大小的拖动功能。当鼠标移动时,会自动调用该函数来进行窗口大小的调整。
阅读全文