pyqt5 self.graphicsView 增加功能鼠标框选矩形,并返回矩形实际坐标
时间: 2024-02-23 10:59:07 浏览: 219
好的,您需要在 PyQt5 的 graphicsView 中增加功能鼠标框选矩形,并返回矩形实际坐标,可以使用 QGraphicsScene 中的 selectionChanged 信号和 QGraphicsView 中的 rubberBandChanged 信号来实现。
具体地,可以在 rubberBandChanged 信号中获取 rubber band 的矩形区域,然后将其转换为场景坐标系中的矩形,并计算出其实际坐标。代码如下:
```python
from PyQt5.QtWidgets import QGraphicsScene, QGraphicsView, QRubberBand
from PyQt5.QtCore import Qt, QRectF
class MyGraphicsView(QGraphicsView):
def __init__(self, parent=None):
super(MyGraphicsView, self).__init__(parent)
self.setDragMode(QGraphicsView.RubberBandDrag)
self.setRubberBandSelectionMode(Qt.IntersectsItemShape)
self.rubberBand = QRubberBand(QRubberBand.Rectangle, self)
self.rubberBandChanged.connect(self.onRubberBandChanged)
self.selectionChanged.connect(self.onSelectionChanged)
def onRubberBandChanged(self, rect, fromScenePoint, toScenePoint):
# 将 rubber band 的矩形区域转换为场景坐标系中的矩形
rect = self.mapToScene(rect).boundingRect()
print('rubber band:', rect)
# 计算实际坐标
rect = QRectF(rect)
rect = rect.intersected(self.sceneRect())
rect = self.mapFromScene(rect).boundingRect()
print('actual rect:', rect)
def onSelectionChanged(self):
# 清空 rubber band
self.rubberBand.hide()
def mousePressEvent(self, event):
# 显示 rubber band
if event.button() == Qt.LeftButton:
self.rubberBand.show()
self.rubberBand.setGeometry(event.pos().x(), event.pos().y(), 0, 0)
self.rubberBand.setFixedWidth(0)
self.rubberBand.setFixedHeight(0)
super(MyGraphicsView, self).mousePressEvent(event)
```
在这个例子中,我们创建了一个 MyGraphicsView 类,继承自 QGraphicsView。在构造函数中,我们设置了拖拽模式为 RubberBandDrag,并将 rubber band 的选择模式设置为 IntersectsItemShape。然后我们创建了一个 QRubberBand 对象用于绘制 rubber band,同时连接了 rubberBandChanged 和 selectionChanged 信号到对应的槽函数中。
在 onRubberBandChanged 槽函数中,我们将 rubber band 的矩形区域使用 mapToScene 方法转换为场景坐标系中的矩形,并输出到控制台中。然后我们计算出实际坐标,方法是先将当前矩形与场景矩形求交,然后再将其转换为视图坐标系中的矩形,并输出到控制台中。
在 onSelectionChanged 槽函数中,我们隐藏 rubber band。
最后,在 mousePressEvent 中,我们显示 rubber band,并设置其初始位置和大小。
希望对您有所帮助!
阅读全文