pyqt5怎么获取self.graphicsView.scale的坐标
时间: 2023-12-15 12:04:26 浏览: 35
您可以使用`self.graphicsView.mapToScene()`方法将视图坐标转换为场景坐标,然后使用场景坐标进行计算。具体地,您可以使用以下代码获取缩放后的坐标:
```python
# 获取视图坐标
view_pos = self.graphicsView.mapFromGlobal(QCursor.pos())
# 转换为场景坐标
scene_pos = self.graphicsView.mapToScene(view_pos)
# 获取缩放比例
scale = self.graphicsView.transform().m11()
# 计算缩放后的坐标
scaled_pos = scene_pos / scale
```
其中,`view_pos`是视图坐标,`scene_pos`是场景坐标,`scale`是当前缩放比例,`scaled_pos`是缩放后的坐标。
相关问题
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())
```
在这个示例中,我们首先获取当前鼠标的位置,然后获取当前视图的中心点。接着将鼠标位置转换为场景坐标系下的位置,然后计算缩放因子。在缩放视图之后,我们将视图中心点移动到鼠标位置上,以达到缩放的效果。
pyqt5怎么为控件 graphicsView 增加用鼠标框选矩形,并返回矩形在图片上的坐标的功能
你可以通过以下步骤为控件 `graphicsView` 增加用鼠标框选矩形,并返回矩形在图片上的坐标的功能:
1. 在 `graphicsView` 中加载图片,可以使用 `QPixmap` 或者 `QImage`,并把它设置为 `graphicsView` 的背景。
2. 在 `graphicsView` 中添加鼠标事件处理函数,用于处理鼠标按下、移动和释放事件。
```python
class GraphicsView(QGraphicsView):
def __init__(self, parent=None):
super().__init__(parent)
self.setScene(QGraphicsScene(self))
self.setMouseTracking(True)
self.rubberBand = QRubberBand(QRubberBand.Rectangle, self)
self.origin = QPoint()
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.origin = event.pos()
self.rubberBand.setGeometry(QRect(self.origin, QSize()))
self.rubberBand.show()
def mouseMoveEvent(self, event):
if self.rubberBand.isVisible():
self.rubberBand.setGeometry(QRect(self.origin, event.pos()).normalized())
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
rect = self.rubberBand.geometry()
if rect.width() > 10 and rect.height() > 10:
# 计算矩形在图片上的坐标
pixmap = self.scene().pixmap()
scale = pixmap.width() / self.width()
x = rect.left() * scale
y = rect.top() * scale
w = rect.width() * scale
h = rect.height() * scale
print("矩形在图片上的坐标:", int(x), int(y), int(w), int(h))
self.rubberBand.hide()
```
3. 在上述代码中,我们创建了一个 `QRubberBand` 对象用于绘制矩形框选区域,并通过鼠标事件处理函数实现了鼠标框选矩形的功能。
4. 在鼠标释放事件中,计算矩形在图片上的坐标,可以通过 `QGraphicsView.scene().pixmap()` 获取 `graphicsView` 中的图片,然后计算矩形在图片上的坐标。
5. 最后,在主程序中创建 `GraphicsView` 对象,并设置图片即可。
```python
if __name__ == '__main__':
app = QApplication(sys.argv)
view = GraphicsView()
view.setSceneRect(0, 0, 800, 600)
view.fitInView(QRectF(0, 0, 800, 600), Qt.KeepAspectRatio)
view.show()
# 加载图片
pixmap = QPixmap("test.jpg")
view.scene().addPixmap(pixmap)
sys.exit(app.exec_())
```