QGraphocsItem

它为编写自己的自定义项目提供了轻量级的基础。这包括定义项目的几何图形、碰撞检测、其绘制实现以及通过其事件处理程序进行项目交互。

要编写自己的图形项,首先创建 QGraphicsItem 的子类,然后首先实现其两个纯虚拟公共函数:boundingRect(),它返回由项绘制的区域的估计值,以及 paint(),它实现实际的绘制。

[pure virtual] QRectF QGraphicsItem::boundingRect() const

这个纯虚函数将项目的外边界定义为一个矩形;所有的绘制必须被限制在项目的边界矩形内。QGraphicsView使用这个来确定项目是否需要重新绘制。

虽然项目的形状可以是任意的,但矩形的边界始终是矩形的,它不受项目转换的影响。

如果希望更改项目的边界矩形,必须首先调用prepareGeometryChange()。这会通知场景即将发生改变,这样它就可以更新它的道具几何索引;否则,场景将不知道项目的新几何形状,结果是未定义的(通常,渲染工件留在视图中)。

重新实现这个函数,让QGraphicsView决定小部件的哪些部分(如果有的话)需要重新绘制。

注意:对于绘制轮廓/描边的形状,重要的是在边界矩形中包含笔画宽度的一半,但不需要补偿反锯齿。


 

[virtual] QPainterPath QGraphicsItem::shape() const

以局部坐标的QPainterPath返回此项的形状。该形状用于许多事情,包括碰撞检测、碰撞测试和QGraphicsScene::items()函数。

默认的实现调用boundingRect()来返回一个简单的矩形,但是子类可以重新实现这个函数来为非矩形项返回一个更精确的形状。例如,一个圆形项目可能会选择返回一个椭圆形状,以便更好地进行碰撞检测。

形状的轮廓可以根据绘制时使用的钢笔的宽度和风格而变化。如果你想在项目的形状中包含这个轮廓,你可以使用QPainterPathStroker从笔触中创建一个形状。

这个函数由contains()和collidesWithPath()的默认实现调用。

就是在boundingRect内进行更精细的绘制


 

[pure virtual] void QGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = ...)

这个函数通常由QGraphicsView调用,它在局部坐标中绘制项目的内容。

在QGraphicsItem子类中重新实现这个函数,使用painter提供项目的绘制实现。option参数为项目提供样式选项,如状态、暴露区域和详细程度提示。小部件参数是可选的。如果提供,它指向正在绘制的部件;否则为0。对于缓存绘制,widget总是0。

绘制器的画笔默认为0宽度,它的画笔从绘制设备的调色板初始化为QPalette::Text笔刷。画笔被初始化为QPalette::Window。

确保将所有绘制都限制在boundingRect()的边界内,以避免呈现残影(因为QGraphicsView不会为你剪辑绘制器)。特别是,当QPainter使用指定的QPen渲染一个形状的轮廓时,轮廓的一半将绘制在外面,一半在里面,你正在渲染的形状(例如,笔的宽度为2个单位,你必须在boundingRect()内绘制一个单位的轮廓)。QGraphicsItem不支持使用非零宽度的画笔。

所有的绘画都是在局部坐标下完成的。

注意:项目必须总是以完全相同的方式重绘自己,除非调用了update();否则,可能会出现残影。换句话说,后续两次对paint()的调用必须总是产生相同的输出,除非在它们之间调用update()。

注意:为项目启用缓存并不能保证paint()只被Graphics View框架调用一次,即使没有任何显式的update()调用。有关更多细节,请参阅setCacheMode()的文档。


 

[virtual] void QGraphicsItem::advance(int phase)

这个虚函数被QGraphicsScene::advance()插槽对所有的项目调用两次。在第一个阶段中,使用phase == 0调用所有项目,表示场景中的项目即将前进,然后使用phase == 1调用所有项目。如果你需要简单的场景控制动画,请重新实现这个函数来更新你的项目。

默认实现不执行任何操作。

这个函数用于动画。另一种选择是从QObject和QGraphicsItem多重继承,并使用动画框架


void QGraphicsItem::setRotation(qreal angle)

设置围绕Z轴的顺时针旋转角度(以度为单位)。默认值为0(即,该项不旋转)。赋值为负值将逆时针旋转项目。通常旋转角度在(-360,360)范围内,但也可以在这个范围之外赋值(例如,旋转370度与旋转10度相同)。

项目围绕其转换原点旋转,默认情况下为(0,0)。您可以通过调用setTransformOriginPoint()来选择一个不同的转换原点。

旋转与项目的scale()、transform()和transforms()相结合,以将项目的坐标系统映射到父项目。


QPointF mapFromItem(const QGraphicsItem *item, const QPointF &point)

将参数中图形项的坐标系中的点映射到当前图形项的坐标系,并返回映射的坐标。


 

QPolygonF mapFromItem(const QGraphicsItem *item, const QRectF &rect)

将参数中图形项的坐标系中的矩形映射到当前图形项的坐标系。并以多边形的形式返回映射的矩形。


QPointF mapFromParent(const QPointF &point)

当前图形项的父项中的参数中的点映射到在当前图形项中的位置。


QPointF mapFromScene(const QPointF &point)

参数是场景中的点,将此点映射为当前图形项坐标系中的点。


QRectF mapRectFromItem(const QGraphicsItem *item, const QRectF &rect)

将参数中图形项的坐标系中的矩形映射到当前图形项的坐标系。并以矩形的形式返回映射的矩形。映射方式和mapFromItem相同,就是返回值类型不同而已,一个返回多边形一个返回矩形(从函数名就可以看出来,多了个Rect)。


 QRectF mapRectFromParent(const QRectF &rect)

将位于当前图形项的父项坐标系中的矩形映射至当前图形项的的坐标系,并以矩形的形式返回映射的矩形。映射方式和mapFromParent相同的,就是返回值类型不同而已,一个返回多边形一个返回矩形(从函数名就可以看出来,多了个Rect)。


 QRectF mapRectFromScene(const QRectF &rect)

将场景坐标中的矩形映射到当前图形项的坐标系,并以矩形的形式返回映射的矩形。映射方式和mapFromScene相同的,就是返回值类型不同而已,一个返回多边形一个返回矩形(从函数名就可以看出来,多了个Rect)。


QRectF mapRectToItem(const QGraphicsItem *item, const QRectF &rect)

和mapRectFromItem()相反。


QRectF mapRectToScene(const QRectF &rect) 

与mapRectFromScene()相反。

  • mapRectFromScene():将场景中的矩形映射为当前图形项坐标中的矩形。
  • mapRectToScene():将当前图形项坐标中的矩形映射为场景中的矩形。

下面还有mapToItem,mapToParent,mapToScene,与上面的对应

 

参考链接


QGraphicsScene *QGraphicsItem::scene() const

返回项目的当前场景,如果项目没有存储在场景中,则返回0。

 

posted @ 2022-03-21 09:02  帝皇の惊  阅读(282)  评论(0)    收藏  举报