前言
在Qt的图形视图框架中,QGraphicsView
、QGraphicsScene
和QGraphicsItem
是三个核心组件,它们共同构建了一个强大的2D图形渲染和交互环境。本文将详细介绍这三个组件的基本用法、坐标系统、常用函数、信号和槽函数。
一、QGraphicsView:视图类
QGraphicsView
是用于显示QGraphicsScene
的窗口部件,它提供了缩放、平移、滚动等高级功能,使得用户可以方便地浏览复杂的场景。
基本用法:
QGraphicsView *view = new QGraphicsView;//创建视图对象
QGraphicsScene *scene = new QGraphicsScene;//创建场景对象
view->setScene(scene);//把场景对象加入到视图中去
视图坐标:
视图坐标是窗口部件的坐标,视图坐标的单位是像素,QGraphicsView的左上角是(0,0)。所有鼠标事件、拖拽事件最开始都使用视图坐标,为了和图元交互,需要转换坐标为场景坐标。
常用函数:
fitInView(QRectF, Qt::AspectRatioMode)
:调整视图以适应给定的矩形。scale(double, double)
:缩放视图。translate(double, double)
:平移视图。setViewportUpdateMode(QGraphicsView::ViewportUpdateMode)
:设置视口更新模式。
常见信号:
viewportEntered()
:当鼠标光标进入视口时发射。viewportExited()
:当鼠标光标离开视口时发射。scrollContentsBy(int dx, int dy)
:当视图内容滚动时发射。rubberBandChanged(QRubberBand::Shape newShape)
:当橡皮筋选择形状改变时发射.
常见槽函数:
updateScene(const QRectF &rect)
:更新场景的一部分。updateScene()
:更新整个场景。ensureVisible(const QRectF &rect, int xmargin = 50, int ymargin = 50, int timeout = 5000)
:确保指定的矩形区域在视图中可见。fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio)
:调整视图以适应指定的矩形区域。centerOn(const QPointF &pos)
:将视图中心移动到指定位置.
二、QGraphicsScene:场景类
QGraphicsScene
是QGraphicsItem
的容器,负责管理场景中的所有图形元素,包括它们的绘制、事件处理以及布局。
基本用法:
QGraphicsScene *scene = new QGraphicsScene;//创建场景对象
scene->addItem(new QGraphicsRectItem(0, 0, 100, 50));//在场景对象中添加图元类
场景坐标:
场景坐标是所有图元的基础坐标系统。场景坐标系统描述了顶层图元的位置,并且构成从视图传播到场景的所有场景事件的基础。每个图元在场景上都有场景坐标和边界矩形。场景坐标的原点在场景中心,坐标原点是X轴正方向向右,Y轴正方向向下。
其原点默认位于场景的左上角。
QGraphicsScene
常用函数:
添加和管理图形项
- addItem(QGraphicsItem *item):将一个QGraphicsItem添加到场景中。
- removeItem(QGraphicsItem *item):从场景中移除一个QGraphicsItem。
- clear():移除场景中的所有图形项。
场景矩形和布局管理
- setSceneRect(const QRectF &rect):设置场景的矩形区域,这影响场景项的索引和可见性。
- itemsBoundingRect():返回场景中所有图形项的边界矩形。
- setItemIndexMethod(QGraphicsScene::ItemIndexMethod method):设置图形项的索引方法,如BSP树或四叉树。
事件处理和交互
- focusItemChanged(QGraphicsItem *newFocusItem, QGraphicsItem *oldFocusItem):当场景的焦点项发生变化时发出。
- selectionChanged():当场景的选择发生变化时发出。
- mousePressEvent(QGraphicsSceneMouseEvent *event):处理鼠标按下事件。
- keyPressEvent(QKeyEvent *event):处理键盘按下事件。
坐标转换
- mapToScene(const QPointF &point):将视图坐标转换为场景坐标。
- mapFromScene(const QPointF &point):将场景坐标转换为视图坐标。
- 动画和更新
- advance():在动画系统中推进场景的时间,但在Qt 5.11及以后版本已被弃用。
- changed(const QList<QRectF> ®ion):通知场景中的某个或某些区域发生了变化,并需要重绘这些区域。
常见信号:
- changed(const QList<QRectF>& region):当场景内容发生变化时发出,参数包含了已更改区域的列表。
- focusItemChanged(QGraphicsItem *newFocusItem, QGraphicsItem *oldFocusItem, Qt::FocusReason reason):当场景中的焦点发生变化时发出,参数提供了新旧焦点项以及焦点变化的原因。
- sceneRectChanged(const QRectF& rect):当场景矩形发生变化时发出,参数是新的场景矩形。
- selectionChanged():当场景的选择发生变化时发出,可以通过selectedItems()获取新的选定项列表。
常见槽函数:
void onSceneRectChanged(const QRectF& rect)
:用于处理场景矩形变化的事件。
void onSelectionChanged()
:用于处理选择变化的事件。
void onFocusItemChanged(QGraphicsItem *newFocusItem, QGraphicsItem *oldFocusItem, Qt::FocusReason reason)
:用于处理焦点项变化的事件。
三、QGraphicsItem:图元类
QGraphicsItem
是QGraphicsScene
中的基本图形元素,可以是矩形、文本、图像、线条等,支持自定义绘制和事件处理。
基本用法:
QGraphicsRectItem *rect = new QGraphicsRectItem(0, 0, 100, 50);//图元类
rect->setPos(50, 50);设置坐标
rect->setPen(QPen(Qt::red));设置图形的边框颜色为红色
坐标:
QGraphicsItem
的坐标原点通常是图形项的中心,这意味着当您设置图形项的位置时,实际上是在设置其中心的位置(图形项中心点相对于其父项或场景的坐标)。如果图形项没有父项,则其坐标原点与场景的坐标原点相同。
在处理坐标时,您可能需要将视图坐标转换为场景坐标,或者将场景坐标转换为图形项坐标。
常用函数:
pos()
:返回图形项的位置,相对于其父项的坐标系。
scenePos()
:返回图形项在场景坐标系中的位置。
setPos(const QPointF &pos)
:设置图形项的位置,参数是相对于其父项的坐标。
setScenePos(const QPointF &pos)
:设置图形项在场景坐标系中的位置。setBrush(const QBrush &)
:设置图形项的填充样式。
常见信号:
itemChange(GraphicsItemChange change, const QVariant &value):当图形项的属性即将发生变化时发出。
常见槽函数:
hoverEnterEvent(QGraphicsSceneHoverEvent *event):当鼠标光标进入图形项的区域时调用。
hoverMoveEvent(QGraphicsSceneHoverEvent *event):当鼠标光标在图形项的区域上移动时调用。
hoverLeaveEvent(QGraphicsSceneHoverEvent *event):当鼠标光标离开图形项的区域时调用。
mousePressEvent(QGraphicsSceneMouseEvent *event):当鼠标按钮在图形项上按下时调用。
mouseMoveEvent(QGraphicsSceneMouseEvent *event):当鼠标在图形项上移动时调用。
mouseReleaseEvent(QGraphicsSceneMouseEvent *event):当鼠标按钮在图形项上释放时调用。
四、三者坐标关系:
这里我先放个参考链接: