Qt中的QGraphicsView、QGraphicsScene与QGraphicsItem:图形视图框架介绍

前言

  在Qt的图形视图框架中,QGraphicsViewQGraphicsSceneQGraphicsItem是三个核心组件,它们共同构建了一个强大的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:场景类

  QGraphicsSceneQGraphicsItem的容器,负责管理场景中的所有图形元素,包括它们的绘制、事件处理以及布局。

基本用法:

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> &region):通知场景中的某个或某些区域发生了变化,并需要重绘这些区域。

常见信号:

  • 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:图元类

  QGraphicsItemQGraphicsScene中的基本图形元素,可以是矩形、文本、图像、线条等,支持自定义绘制和事件处理。

基本用法:

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):当鼠标按钮在图形项上释放时调用。

四、三者坐标关系:

这里我先放个参考链接:

链接

QGraphicsViewQGraphicsSceneQt用于2D图形显示和交互的重要组件。下面是它们的基本使用教程: 1. 创建QGraphicsScene对象 ```cpp QGraphicsScene* scene = new QGraphicsScene(parent); ``` 2. 将图形元素添加到场景 ```cpp QGraphicsItem* item = new QGraphicsItem(); scene->addItem(item); ``` 3. 创建QGraphicsView对象 ```cpp QGraphicsView* view = new QGraphicsView(scene, parent); ``` 4. 设置视图显示区域大小 ```cpp view->setFixedSize(width, height); ``` 5. 将视图添加到主窗口 ```cpp layout->addWidget(view); ``` 6. 设置视图的缩放和平移 ```cpp view->setDragMode(QGraphicsView::ScrollHandDrag); //启用拖拽模式 view->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); //更新视图时,只更新可见区域 view->setRenderHint(QPainter::Antialiasing); //启用反锯齿 view->setOptimizationFlag(QGraphicsView::DontAdjustForAntialiasing); //不自适应反锯齿 view->setInteractive(true); //启用交互 //设置缩放 view->setRenderHint(QPainter::SmoothPixmapTransform); view->setResizeAnchor(QGraphicsView::AnchorUnderMouse); view->setTransformationAnchor(QGraphicsView::AnchorUnderMouse); //设置平移 view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ``` 7. 设置场景的背景 ```cpp scene->setBackgroundBrush(QBrush(Qt::white)); ``` 8. 设置图形元素的属性 ```cpp item->setPos(x, y); //设置元素在场景的位置 item->setZValue(z); //设置元素的堆叠顺序 item->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); //设置元素的交互属性 ``` 9. 处理视图和场景的事件 ```cpp void MyView::mousePressEvent(QMouseEvent* event) { QGraphicsView::mousePressEvent(event); QPointF scenePos = mapToScene(event->pos()); //处理场景的元素事件 } void MyScene::mousePressEvent(QGraphicsSceneMouseEvent* event) { QGraphicsScene::mousePressEvent(event); QGraphicsItem* item = itemAt(event->scenePos(), QTransform()); //处理元素事件 } ``` 以上是QGraphicsViewQGraphicsScene的基本使用教程,可以根据实际需求进行进一步的开发和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值