QGraphicsView、QGraphicsScene和QGraphicsItem图形视图框架(一)简单介绍

一、QGraphicsView

1.介绍

QGraphicsView是一个窗口小部件,用于显示QGraphicsScene中的内容。当场景的尺寸大于视图的尺寸时可以缩放和滚动场景,以便用户可以查看场景的不同部分。QGraphicsView类似于一个相机,它观察场景并将其呈现在屏幕上。

2.坐标系

坐标系与窗口坐标系相同,向右为x轴正方向,向下为y轴正方向,左上角为原点。

 3.常用函数:

1)setScene

void setScene(QGraphicsScene *scene)

将当前场景设置为场景。若场景已被查看,则此函数不执行任何操作。
当在视图上设置场景时,QGraphicsScene::changed()信号会自动连接到此视图的updateScene()插槽,并调整视图的滚动条以适应场景的大小。
视图不拥有场景的所有权。

2)setRenderHint

void setRenderHint(QPainter::RenderHint hint, bool enabled = true)
void setRenderHints(QPainter::RenderHints hints)

设置渲染方式

常量说明

QPainter::Antialiasing

指示引擎应尽可能对图元的边缘进行抗锯齿处理。

QPainter::TextAntialiasing

指示引擎应尽可能对文本进行抗锯齿处理。要强制禁用文本的抗锯齿功能,请不要使用此提示。相反,在字体的样式策略上设置QFont::NoAntialias。

QPainter::SmoothPixmapTransform

指示引擎应使用平滑的像素映射变换算法(如双线性),而不是最近邻算法。

 3)setHorizontalScrollBarPolicy和setVerticalScrollBarPolicy

void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy) (水平)
void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)   (垂直)
设置滚动条策略

常量

说明

Qt::ScrollBarAsNeeded

0

内容太大而无法容纳时显示滚动条,否则不会显示。这是默认设置。

Qt::ScrollBarAlwaysOff

1

从不显示滚动条。

Qt::ScrollBarAlwaysOn

2

始终显示滚动条。

注意:当不想显示滚动条时,可通过该方式,但是仅是不显示滚动条,还是可以通过滚轮滚动滚动条。如果想禁用滚轮,可以重写QGraphicsView中的void wheelEvent(QWheelEvent *event)滚轮事件,不再执行本身的滚轮事件即可。

还有一种方法就是直接禁用滚动条

verticalScrollBar()->blockSignals(true);

horizontalScrollBar()->blockSignals(true);

若block为true,则此对象发出的信号将被阻止(即,发出信号不会调用与其连接的任何东西)。

4)setViewportUpdateMode

void setViewportUpdateMode(ViewportUpdateMode mode)
视口应如何更新其内容。
QGraphicsView使用此属性来决定如何更新已重新曝光或更改的场景区域。通常不需要修改此属性,但在某些情况下,这样做可以提高渲染性能。有关具体详细信息,请参阅ViewportUpdateMode文档。
默认值是MinimalViewportUpdate,其中QGraphicsView将在内容更改时更新尽可能小的视口区域。

常量

说明

QGraphicsView::FullViewportUpdate

0

当场景的任何可见部分更改或重新曝光时,QGraphicsView将更新整个视口。当QGraphicsView花费的时间比绘制时间更多时(例如,当许多小项目被重复更新时),这种方法最快。这是不支持部分更新的视口(如QGLWidget)和需要禁用滚动优化的视口的首选更新模式。

QGraphicsView::MinimalViewportUpdate

1

QGraphicsView将确定需要重绘的最小视口区域,通过避免重绘未更改的区域来最大限度地减少绘图时间。这是QGraphicsView的默认模式。虽然这种方法总体上提供了最佳性能,但如果场景上有许多可见的小变化,QGraphicsView最终可能会花费比绘图更多的时间来找到最小的方法。

QGraphicsView::SmartViewportUpdate

2

QGraphicsView将尝试通过分析需要重绘的区域来找到最佳更新模式。

QGraphicsView::BoundingRectViewportUpdate

4

视口中所有更改的边界矩形都将被重新绘制。此模式的优点是QGraphicsView只搜索一个区域以查找更改,从而最大限度地减少了确定需要重新绘制的内容所花费的时间。缺点是,没有改变的区域也需要重新绘制。

QGraphicsView::NoViewportUpdate

3

当场景发生变化时,QGraphicsView将永远不会更新其视口;期望用户控制所有更新。此模式禁用QGraphicsView中的所有(可能很慢)项目可见性测试,适用于需要固定帧率的场景,或者视口在外部更新的场景。

 5)scale

void scale(qreal sx, qreal sy)
按(sx,sy)缩放当前视图变换。

参数值大于1为放大,小于1为缩小。

 6)transform

QTransform transform() const

返回视图的当前变换矩阵。如果没有设置当前变换,则返回单位矩阵。

x轴缩放系数:transform().m11()  

y轴缩放系数:transform().m22() 

7) viewport

QWidget* viewport() const
返回视口小部件。

8)mapFromScene和mapToScene

QPoint mapFromScene(const QPointF &point) const
QPolygon mapFromScene(const QRectF &rect) const
QPolygon mapFromScene(const QPolygonF &polygon) const
QPainterPath mapFromScene(const QPainterPath &path) const

QPoint mapFromScene(qreal x, qreal y) const
QPolygon mapFromScene(qreal x, qreal y, qreal w, qreal h) const

将场景坐标点返回到视口坐标。

QPointF mapToScene(const QPoint &point) const
QPolygonF mapToScene(const QRect &rect) const
QPolygonF mapToScene(const QPolygon &polygon) const
QPainterPath mapToScene(const QPainterPath &path) const

QPointF mapToScene(int x, int y) const
QPolygonF mapToScene(int x, int y, int w, int h) const

返回映射到场景坐标的视口坐标点。

二、QGraphicsScene

1.介绍

QGraphicsScene是一个用于管理大量图形项目的容器。场景中的每个项目都是QGraphicsItem的子类。场景负责处理项目的交互和碰撞检测。QGraphicsScene类似于一个舞台,上面放置了各种角色(即图形项目)。

2.坐标系

坐标系向右为x轴正方向,向下为y轴正方向,中心点为原点。

在默认情况下,场景中心与视图中心是一致的,因为QGraphicsView会自动将场景的中心区域定位到视图的中心位置。

3.常用函数:

1)setSceneRect

void setSceneRect(const QRectF &rect)
设置场景的边界矩形
场景矩形定义了场景的范围。它主要由QGraphicsView用于确定视图的默认可滚动区域,由QGraphicsScene用于管理项目索引。
如果未设置,或者设置为空QRectF,sceneRect()将返回自场景创建以来场景上所有项目的最大边界矩形(即,当项目添加到场景中或在场景中移动时,矩形会增长,但永远不会缩小)。

注意: setSceneRect()方法仅用于设置场景的尺寸和位置,并不改变场景的坐标原点。

2)addItem

void addItem(QGraphicsItem *item)
将项目及其所有子项添加或移动到此场景中。此场景拥有该项目的所有权。

 3)removeItem

void removeItem(QGraphicsItem *item)
从场景中删除项目及其所有子项。项目的所有权将传递给调用者(即QGraphicsScene在销毁时将不再删除项目)。

4)clear

void clear()
从场景中删除所有项目,否则场景的状态不变。

5)clearSelection

void clearSelection()
清除当前选择。

三、QGraphicsItem

1.介绍

QGraphicsItem是一个抽象基类,用于表示场景中的图形项目。有许多预定义的子类,如QGraphicsPixmapItem、QGraphicsTextItem、QGraphicsPolygonItem等,用于创建不同类型的图形对象。QGraphicsItem类似于舞台上的角色,具有形状、位置、大小等属性。

2.坐标系

坐标系向右为x轴正方向,向下为y轴正方向,默认左上角为原点。

3.常用函数

 1)boundingRect(注意:这是一个纯虚函数,在创建的自定义的QGraphicsItem的类中需要实现该函数。)

virtual QRectF boundingRect() const = 0
纯虚函数:将项目的外边界定义为矩形;所有绘画必须限制在项目的边界矩形内。QGraphicsView使用此功能来确定项目是否需要重新绘制。
虽然项目的形状可以是任意的,但边界矩形始终是矩形的,不受项目变换的影响。
如果要更改项目的边界矩形,必须首先调用prepareGeometryChange()。这会通知场景即将发生的更改,以便它可以更新其项目几何索引;否则,场景将不知道项目的新几何体,并且结果未定义(通常,渲染伪影会留在视图中)。

2)clearFocus

void clearFocus()
从项目中获取键盘输入焦点。如果它有焦点,则会向此项目发送一个焦点转移事件,告诉它即将失去焦点。
只有设置了ItemIsFocusable标志的项目或设置了适当焦点策略的小部件才能接受键盘焦点。

 3)setFlag

void setFlag(GraphicsItemFlag flag, bool enabled = true)
void setFlags(GraphicsItemFlags flags)

设置标志

常量

说明

QGraphicsItem::ItemIsMovable

0x1

该项目支持使用鼠标进行交互式移动。通过单击项目然后拖动,项目将与鼠标光标一起移动。如果项目有子项,则所有子项也会被移动。如果该项目是选择的一部分,则所有选定项目也将被移动。此功能是通过QGraphicsItem的鼠标事件处理程序的基本实现提供的。

QGraphicsItem::ItemIsSelectable

0x2

该项目支持选择。启用此功能将启用setSelected()来切换项目的选择。它还将允许通过调用QGraphicsScene::setSelectionArea()、单击项目或在QGraphicsView中使用橡皮筋选择来自动选择项目。

QGraphicsItem::ItemIsFocusable

0x4

该项支持键盘输入焦点(即,它是一个输入项)。启用此标志将允许项目接受焦点,这再次允许将关键事件传递给QGraphicsIntem::keyPressEvent()和QGraphicsIntem::keyReleaseEvent()。

QGraphicsItem::ItemClipsToShape

0x8

该项目可剪裁成自己的形状。该项目无法在其形状之外绘制或接收鼠标、平板电脑、拖放或悬停事件。默认情况下,它处于禁用状态。此行为由QGraphicsView::drawItems()或QGraphicsScene::drawItem()强制执行。这个标志是在Qt 4.3中引入的

QGraphicsItem::ItemClipsChildrenToShape

0x10

该项目将其所有后代的绘画剪裁成自己的形状。作为此项目的直接或间接子项的项目不能绘制到此项目的形状之外。默认情况下,此标志处于禁用状态;孩子们可以在任何地方画画。此行为由QGraphicsView::drawItems()或QGraphicsScene::drawItem()强制执行。这个标志是在Qt 4.3中引入的。

4)setPos

void setPos(const QPointF &pos)
void setPos(qreal x, qreal y)
设置位置,即父坐标中的位置。对于没有父项的项目,pos位于场景坐标中。

5)setRotation

void setRotation(qreal angle)
设置围绕Z轴的顺时针旋转角度(单位:度)。默认值为0(即项目不旋转)。指定负值将使项目逆时针旋转。通常,旋转角度在(-360,360)范围内,但也可以指定此范围之外的值(例如,370度的旋转与10度的旋转相同)。
该项目围绕其变换原点旋转,默认情况下为(0,0)。您可以通过调用setTransformOriginPoint()来选择不同的转换原点。

6)setSelected

void setSelected(bool selected)
如果选择为真且此项可选择,则选择此项;否则,它将被取消选择。
如果项目在一个组中,则整个组的选定状态将通过此功能切换。如果选择了该组,则该组中的所有项目也将被选择,如果未选择该组,那么该组中没有项目被选择。
只能选择可见、已启用、可选择的项目。如果选择为true,并且此项不可见、禁用或不可选择,则此函数不执行任何操作。
默认情况下,无法选择项目。要启用选择,请设置ItemIsSelectable标志。

7)setTransformOriginPoint

void setTransformOriginPoint(const QPointF &origin)
void setTransformOriginPoint(qreal x, qreal y)
在项目坐标中设置变换的原点。

8)setZValue

void setZValue(qreal z)
设置Z值。Z值决定兄弟(相邻)项目的堆叠顺序。Z值较高的兄弟项目将始终绘制在Z值较低的兄弟项目之上。
默认Z值为0。

9)shape

virtual QPainterPath shape() const
将此项的形状作为局部坐标中的QPainterPath返回。该形状用于许多事情,包括碰撞检测、命中测试和QGraphicsScene::items()函数。
默认实现调用boundingRect()返回一个简单的矩形形状,但子类可以重新实现此函数,为非矩形项目返回更精确的形状。例如,圆形项目可能会选择返回椭圆形,以便更好地进行碰撞检测。

 10)paint(注意:这是一个纯虚函数,在创建的自定义的QGraphicsItem的类中需要实现该函数。)

virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = Q_NULLPTR) = 0
使用painter在QGraphicsIntem子类中重新实现此函数,以提供项目的绘制实现。选项参数为项目提供样式选项,例如其状态、暴露区域及其详细程度提示。widget参数是可选的。如果提供,它会指向正在绘制的小部件;否则为0。对于缓存的绘画,小部件始终为0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值