当在QGraohicsView中添加了滚动条可以通过改变滚动条的位置来查看view的不同位置处的元素。那么当改变了查看位置时,我们往往需要获取当前界面显示区域的场景坐标或视图坐标。可以用一下的方式来获取这两种坐标。
QRect viewport_rect(0,0,use_view->viewport()->width(),use_view->viewport()->height());
QRectF visable_scene = use_view->mapToScene(viewport_rect).boundingRect();
visable_scene坐标即为转换后的可视区域的坐标信息,包括起始点x,y坐标和显示的宽、高。
当在QGraohicsView中添加了滚动条可以通过改变滚动条的位置来查看view的不同位置处的元素。那么当改变了查看位置时,我们往往需要获取当前界面显示区域的场景坐标或视图坐标。可以用一下的方式来获取这两种坐标。 QRect viewport_rect(0,0,use_view->viewport()->width(),use_view->viewport()->height()); QRectF visable_scene = use_view->mapToScene(
当在使用QGraphicsView时,创建一个QGraphicsView大小为 800 * 600 ,创建一个QGraphicsScene大小为800 * 1000时,view自动出现了滚动条。
默认的滚动条位置在中间的位置。
设置滚动条位置
pview->verticalScrollBar()->setSliderPosition(0);
pview->horizontal
ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
python3
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # 关闭垂直滚动条
self.setHorizontal
PyQt5中的QGraphics View小于场景Scene时,会出现ScrollBar滚动条。
在某些场景下我们是不需要滚动条出现,比如:带有move功能的工具时,仅仅需要移动scene中的Item即可。
1. 关闭滚动条的显示
首先,掩耳盗铃。针对上述问题,滚动条依然和鼠标滚轮相关,但是它看不见了,大不了不用滚轮。
# 设置滚动步进,无用
# self.view.horizontalScrollBar().setSingleStep(0)
# self.view.verticalScrollBar(.
坐标点的显示在右下角。
在Graphics View框架结构主要包含三个类:场景类(QGraphicsScene)、视图类(QGraphicsView)和图元类(QGraphicsItem),统称为“三要素”。这三要素都有自己的坐标系,各个坐标系之间可以相互转换。这次博客主要实现的就是展现鼠标在其中两个坐标系的坐标点。
场景坐标
场景坐标是所有图元的基础坐标系统。场景坐标系统描述了顶层图元的位置,并且构成从视图传播到场景的所有场景事件的基础。每个图元在场景上都有场景坐标和边界矩形。场景坐标
您可以使用QGraphicsView的mapToScene()函数将鼠标的屏幕坐标转换为场景坐标,然后再使用QGraphicsScene的itemAt()函数获取鼠标下的图形项。以下是示例代码:
```python
from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene
class MyGraphicsView(QGraphicsView):
def __init__(self, parent=None):
super(MyGraphicsView, self).__init__(parent)
self.setScene(QGraphicsScene(self))
self.setMouseTracking(True)
def mouseMoveEvent(self, event):
pos = event.pos()
scene_pos = self.mapToScene(pos)
item = self.scene().itemAt(scene_pos, self.transform())
if item is not None:
print("Mouse is over item:", item)
else:
print("Mouse is over scene at position:", scene_pos)
在上述代码中,我们重写了QGraphicsView的mouseMoveEvent()函数来获取鼠标移动事件。我们首先获取鼠标的屏幕坐标,然后使用mapToScene()函数将其转换为场景坐标。然后使用itemAt()函数获取鼠标下的图形项。如果找到了图形项,则打印其信息,否则打印鼠标在场景中的位置。