一、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) constQPoint 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) constQPointF 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。