Qt图形视图框架:QGraphicsItem详解(长文)

一、类型成员

1.1、QGraphicsItem::CacheMode:图形项的缓存模式

缓存图形加快渲染速度,当需要重新绘制时图形项使用缓存的图形。

1、NoCache

默认值,所有图形项缓存均已禁用。每次需要重新绘制图形项时,都会调用QGraphicsItem::paint()。

2、ItemCoordinateCache

为图形项的逻辑(本地)坐标系启用了缓存。 图形项创建一个具有可配置大小/分辨率的屏幕外像素缓冲区。呈现质量通常会下降,具体取决于缓存的分辨率和图形项转换。第一次绘制该图形项时,它将自身呈现到高速缓存中,然后对于以后的每次暴露都重新使用该高速缓存。

3、DeviceCoordinateCache

在绘制设备级别的设备坐标中启用了缓存。此模式适用于可以移动但不能旋转,缩放或剪切的图形项。 如果直接或间接转换该图形项,则缓存将自动重新生成。DeviceCoordinateCache始终以最高质量呈现。

1.2、QGraphicsItem::GraphicsItemChangeitemChange()通知状态的更改

通知是在状态更改时发送的。注意:在itemChange()内调用函数时要小心,因为某些函数调用会导致不必要的递归。例如,不能在ItemPositionChange通知的itemChange()中调用setPos(),因为setPos()函数将再次调用itemChange(ItemPositionChange)。 

1、ItemEnabledChange

图形项的启用状态更改。如果图形项当前已启用,它将被禁用,反之亦然。value参数是新的启用状态(bool)。传递此通知时,请勿在itemChange()中调用setEnabled()。 

QVariant sliderGraphicsPixmapItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
    if(change == ItemEnabledChange)
    {
        qDebug()<<"enable change "<

2、ItemEnabledHasChanged

ItemEnabledChange一样都是在setEnabled()的时候设置的。

Qt图形视图框架:QGraphicsItem详解(长文)_第1张图片

可见ItemEnabledChangeItemEnabledHasChanged参数都是新的状态,但ItemEnabledChange是在新状态启用之前发送的,ItemEnabledHasChanged是新状态启用之后发送的。

源码片段:

Qt图形视图框架:QGraphicsItem详解(长文)_第2张图片

可见是先发送ItemEnabledChange、再设置可用状态、再发送ItemEnabledHasChanged

以下每个标识大多也都有一个对应的xxxHasChanged标识,不赘诉。

3、ItemPositionChange

图形项的位置改变。如果启用了QGraphicsItem::GraphicsItemFlag枚举中的ItemSendsGeometryChanges标志,并且当图形项的本地位置相对于其父项发生更改(通过调用setPos()或moveBy()的)则会发送此通知。value参数是新位置(QPointF)。 您可以调用pos()来获取原始位置。传递此通知时,请勿在itemChange()中调用setPos()或moveBy()。

4、ItemTransformChange

变换矩阵改变。如果启用了QGraphicsItem::GraphicsItemFlag枚举中的ItemSendsGeometryChanges标志,并且在图形项的本地转换矩阵发生更改(调用setTransform())则发送此通知。value参数是新矩阵(QTransform)。在传递此通知时,请勿调用setTransform()或在itemChange()中设置任何转换属性。

5、ItemRotationChange

旋转属性改变。如果启用了QGraphicsItem::GraphicsItemFlag枚举中的ItemSendsGeometryChanges标志,并且图形项的旋转属性发生更改(调用setRotation()),则会发送此通知。 value参数是新的旋转参数(double)。 传递此通知时,请勿在itemChange()中调用setRotation()。 

6、ItemScaleChange

比例属性改变。 如果启用了QGraphicsItem::GraphicsItemFlag枚举中的ItemSendsGeometryChanges标志,并且图形项的比例属性发生更改(调用setScale()),则会发送此通知。value参数是新的比例值(double)。传递此通知时,请勿在itemChange()中调用setScale()。

7、ItemTransformOriginPointChange

变换原点属性改变。如果启用了QGraphicsItem::GraphicsItemFlag枚举中的ItemSendsGeometryChanges标志,并且图形项的变换原点属性发生更改(调用setTransformOriginPoint()),则发送此通知。value参数是新的原点(QPointF)。传递此通知时,请勿在itemChange()中调用setTransformOriginPoint()。

8、ItemSelectedChange

选择状态改变。如果当前选择了图形项,则它将变为未选择状态,反之亦然。value参数是新的选定状态(bool)。传递此通知时,请勿在itemChange()中调用setSelected()。

9、ItemVisibleChange

可见状态发生改变。如果图形项当前可见,它将变为不可见,反之亦然。value参数是新的可见状态(bool)。传递此通知后,请勿在itemChange()中调用setVisible()。

10、ItemParentChange

父项发生更改。value参数是新的父项(QGraphicsItem * )。传递此通知时,请勿在itemChange()中调用setParentItem()。 

QVariant转QGraphicsItem*:

    QGraphicsItem * parent = value.value();

11、ItemChildAddedChange

子项被添加到当前图形项。value参数是新的子项(QGraphicsItem*)。传递此通知时,请勿将当前图形项传递给任何其他图形项的setParentItem()函数。(这个标识没有xxxHasChanged标识)

12、ItemChildRemovedChange

从当前图形项中删除了一个子项。value参数是将要删除的子项(QGraphicsItem*)。(这个标识没有xxxHasChanged标识)

13、ItemSceneChange

图形项所在场景变更。当将图形项添加到其初始场景以及将其从场景删除时,也会发送此通知。value参数是新场景(QGraphicsScene*),如果从场景中删除了该图形项,则为nullptr。传递此通知时,请勿通过将此图形项传递给QGraphicsScene::addItem()来覆盖此更改。请谨慎使用此功能; 反对场景更改会迅速导致不必要的递归。

14、ItemCursorChange

图形项的光标改变。value参数是新的游标(QCursor)。传递此通知后,请勿在itemChange()中调用setCursor()。

15、ItemToolTipChange

图形项的工具提示会更改。value参数是新的工具提示(QToolTip)。传递此通知后,请勿在itemChange()中调用setToolTip()。

16、ItemFlagsChange

图形项的标记更改。value参数是新标记(quint32)。 传递此通知时,请勿在itemChange()中调用setFlags()。 

17、ItemZValueChange

图形项的Z值发生变化。value参数是新的Z值(double)。传递此通知时,请勿在itemChange()中调用setZValue()。

18、ItemOpacityChange

图形项的不透明度发生变化。value参数是新的不透明度(double)。传递此通知时,请勿在itemChange()中调用setOpacity()。

19、ItemScenePositionHasChanged

图形项的场景位置已更改。 如果启用了QGraphicsItem::GraphicsItemFlag枚举中的ItemSendsScenePositionChanges标志,并且图形项的场景位置已更改(即,图形项本身的位置或变换或任何祖先的位置或变换已更改),则发送此通知。value参数是新的场景位置(QPointF)。(这个标识没有xxxHasChanged标识)

1.3、QGraphicsItem::GraphicsItemFlag:图形项标志

此枚举描述了可以在图形项上设置的不同标志,启用/禁用标志可以启用/禁用图形项的相应功能。默认情况下是禁用所有标志的。

1、ItemIsMovable

该图形项支持使用鼠标进行交互式移动。通过单击该图形项然后拖动,该图形项将与鼠标光标一起移动。如果该图形项有子项,则所有子项也将移动。如果图形项是被选中的图形项中的一个,则所有选中的图形项也会移动。

2、ItemIsSelectable

该图形项支持被选中。

3、ItemIsFocusable

该图形项支持键盘输入焦点。启用此标志将允许将键事件传递到QGraphicsItem::keyPressEvent()和QGraphicsItem::keyReleaseEvent()。

4、ItemClipsToShape

图形项会剪裁成自己的形状。该图形项无法在其形状之外绘制或接收鼠标、拖放、悬停事件。此行为由QGraphicsView::drawItems()或QGraphicsScene::drawItems()强制执行。

5、ItemClipsChildrenToShape

图形项将其所有子项的绘画剪裁成自己的形状。此项的直接或间接子项不能超出该图形项的形状。此行为由QGraphicsView::drawItems()或QGraphicsScene::drawItems()强制执行。

6、ItemIgnoresTransformations

图形项将忽略继承的转换(即其位置仍固定在其父项上,但是将忽略父项或视图的旋转,缩放或剪切转换)。该标志对于保持文本标签图形项水平和不缩放很有用。设置后,图形项的视图几何和场景几何将分别维护。您必须调用deviceTransform()来映射坐标并检测视图中的碰撞。

7、ItemIgnoresParentOpacity

图形项将的不透明度不受父项的影响。

8、ItemDoesntPropagateOpacityToChildren

图形项不会将其不透明度传播给子项。

9、ItemStacksBehindParent

该图形项堆叠在其父项的后面。默认情况下,子项堆叠在父项的顶部的。此标志对于阴影效果和遵循父项的几何形状而不在其顶部绘制的装饰对象很有用。

10、ItemUsesExtendedStyleOption

该项使用QStyleOptionGraphicsItem中的exposedRect或matrix。默认情况下,exposedRect初始化为项的boundingRect()。可以为样式选项启用此标志,以设置更细粒度的值。QStyleOption

Qt图形视图框架:QGraphicsItem详解(长文)_第3张图片

11、ItemHasNoContents

该图形项不会绘制任何内容(在该图形项上调用paint()无效)。

12、ItemSendsGeometryChanges

该图形项为:

  • ItemPositionChange
  • ItemPositionHasChanged
  • ItemTransformChange
  • ItemTransformHasChanged
  • ItemRotationChange
  • ItemRotationHasChanged
  • ItemScaleChange
  • ItemScaleHasChanged
  • ItemTransformOriginPointChange
  • ItemTransformOriginPointHasChanged

启用/禁用itemChange()通知。出于性能原因,默认情况下是禁用这些通知的(根据需要分别自行开启)。

13、ItemAcceptsInputMethod

图形项支持亚洲语言的输入法。

14、ItemNegativeZStacksBehindParent

如果图形项的z值为负值,则该图形项会自动堆叠在其父项的后面。此标志使setZValue()可以切换ItemStacksBehindParent。

15、ItemIsPanel

该图形项是一个面板。面板提供激活和包含的焦点处理。一次只能激活一个面板。 如果没有面板处于活动状态,则QGraphicsScene会激活所有非面板图形项。QGraphicsWidget(即QGraphicsItem::isWindow()返回true)是面板。 

16、ItemSendsScenePositionChanges

图形项为ItemScenePositionHasChanged启用itemChange()通知。 出于性能原因,默认情况该通知是禁止的。

17、ItemContainsChildrenInShape

图形项的所有直接或间接子项仅在该图形项的形状内绘制。与ItemClipsChildrenToShape不同,此限制没有强制执行。设置此标志可以更有效地进行绘制和碰撞检测。注:如果同时设置了此标志和ItemClipsChildrenToShape,则将强制执行剪辑。这等效于仅设置ItemClipsChildrenToShape。

1.4、QGraphicsItem::PanelModality:模态面板的行为。

模态面板是阻止输入到其他面板的面板。请注意,作为模态面板子级的项不会被阻止。

1、NonModal

该面板不是模态面板,不会阻止其他面板的输入。这是面板的默认值。

2、PanelModal

该面板是单个图形项层次结构的模态,并阻止输入到其父面板,所有祖父母面板以及其父面板和祖父母面板的所有同级。

3、SceneModal

该面板对整个场景是模态的,并阻止对所有面板的输入。

1.5、QGraphicsItem::anonymous:图形项类的虚函数type()函数返回的值。

图形项类都与Type的唯一值相关联,自定义的图形项只有实现了type()才能使用qgraphicsitem_cast()进行正确的类型转换。

1、Type:1。

2、UserType:65536。

二、成员函数

1、Qt::MouseButtons acceptedMouseButtons()

返回图形项接受鼠标事件的鼠标按钮。 默认情况下,接受所有鼠标按钮。如果某个图形项接受鼠标按钮,则在为该鼠标按钮传递鼠标按下事件时,它将成为鼠标抓取器项(mouse grabber item)。 如果图形项不接受该按钮,则场景会将鼠标事件转发到按下处支持该按钮的第一个图形项。

2、void advance(int phase)

QGraphicsScene::advance()对所有图形项两次调用此虚函数。在第一阶段中,所有图形项都以阶段 phase = 0进行调用,指示场景中的图形项即将活动(位置变化),下以phase == 1进行调用。例(来自官方demo:碰撞的小老鼠):

    QGraphicsScene * scene = new QGraphicsScene;
    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, scene, &QGraphicsScene::advance);
    timer->start(33);

void Mouse::advance(int step)
{
    if (step == 0)
    {
        return;
    }

    static auto x = 0;
    setPos(x,10*sin(x));
    ++x;
}

Qt图形视图框架:QGraphicsItem详解(长文)_第4张图片

3、QRectF boundingRect()

图形项的外接矩形。纯虚函数。所有绘制都必须限制在此外接矩形区域内。视图使用它来确定该图形项是否需要重绘。尽管图形项的形状可以是任意的,但边界矩形始终为矩形,并且不受图形项变换的影响。如果要更改图形项的边界矩形,必须首先调用prepareGeometryChange()(否则图形项会有残影)。这会通知场景即将发生的更改,以便可以更新图形项几何索引。重新实现此功能,以使视图确定哪些部分(如果有的话)需要重绘。

4、QRegion boundingRegion(const QTransform &transform)

图形项的边界区域(轮廓区域)。返回区域的坐标空间取决于transform。如果将标识QTransform作为参数传递,则此函数将返回局部坐标区域。

轮廓区域描述了图形项的视觉内容的粗略轮廓。尽管计算成本很高,但是它比boundingRect()更精确,并且避免在更新图形项时不必要的重新绘制。这对于不复杂的图形项(例如线条或简单的多边形)特别有效。如果希望此函数在场景坐标中返回QRegion,则可以传递sceneTransform()作为参数。

5、QList childItems()

返回子项列表。按堆叠顺序排序。 

6、QRectF childrenBoundingRect()

在本地坐标中返回此图形项的后代(其子代、孙代等)的边界矩形。在将所有后代映射到本地坐标后,该矩形将包含所有后代。这不包括该项自己的边界矩形。它仅返回其后代的累积边界矩形。

7、void clearFocus()

图形项失去键盘输入焦点。可用于文本图形项QGraphicsTextItem设置可编辑setTextInteractionFlags(Qt::TextEditorInteraction)之后。

8、QPainterPath clipPath()

返回图形项的剪切路径,剪切路径限制了图形项的外观和交互(限制了图形项可以在其中绘制和接收事件的区域)。可以通过设置ItemClipsToShapeItemClipsChildrenToShape标志来启用剪切。剪切路径是通过将所有剪切祖先的形状相交来计算的。如果图形项设置了ItemClipsToShape,则最终剪辑将与图形项自己的形状相交。裁剪会对所有涉及的图形项造成性能损失,通常应尽可能避免使用裁剪(如果图形项始终在boundingRect()或shape()边界内绘制,则无需裁剪)。例:上面的小老鼠设置:

    setFlag(QGraphicsItem::ItemClipsToShape, true);
    Mouse *mouse = new Mouse;
    scene->addItem(mouse);
    auto path = mouse->clipPath();
    qDebug()<

Qt图形视图框架:QGraphicsItem详解(长文)_第5张图片

即裁剪得到的绘制路径是shape()设置的路径:

Qt图形视图框架:QGraphicsItem详解(长文)_第6张图片

Qt图形视图框架:QGraphicsItem详解(长文)_第7张图片

裁剪之后老鼠的形状变了,不在路径范围内的被裁剪掉了。

9、bool collidesWithPath(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape)

图形项与路径碰撞检测。碰撞由模式决定。如果图形项与该路径相交或包含,则发送碰撞。此函数检查图形项的shape()或boundingRect()(取决于模式)是否包含在路径中,而不检查路径是否包含在图形项的shape()或boundingRect()中。

10、bool collidesWithItem(const QGraphicsItem *other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape)

图形项间碰撞检测。如果当前图形项与其他图形项发生碰撞,则返回true;否则,返回true。否则返回false。将参数中的模式应用于其他对象,然后将生成的形状或边界矩形与当前图形项的形状进行比较,根据是否相交、包含确定是否发送碰撞。默认实现基于检测形状交集(两个图形项上都调用shape())。当形状复杂时,任意形状-形状相交的复杂性会大幅度提升,因此此操作会非常耗时。可以选择在自定义图形项中重新实现此功能,以提供自定义算法。

Qt::ItemSelectionMode

  • Qt::ContainsItemShape:如果被检测项的shape()完全包含在检测项内,算做碰撞。
  • Qt::IntersectsItemShape:如果被检测项的形状shape()与检测项有交集,算做碰撞。
  • Qt::ContainsItemBoundingRect:如果被检测项的外接矩形boundingRect()完全包含在检测项内,算做碰撞。
  • Qt::IntersectsItemBoundingRect:如果被检测项的外接矩形boundingRect()与检测项有交集,算做碰撞。

11、QList collidingItems(Qt::ItemSelectionMode mode = Qt::IntersectsItemShape)

获取与当前项碰撞的图形项列表。

12、QGraphicsItem * commonAncestorItem(const QGraphicsItem *other)

返回当前图形项与参数图形项最接近的公共祖先项。(实用)

13、bool contains(const QPointF &point)

如果图形项包含以本地坐标(图形项坐标)表示的点,则返回true。虚函数,源码:

14、QVariant data(int key)

以QVariant的形式返回此项的自定义数据。

15、void setData(int key, const QVariant &value)

将此图形项的自定义数据设置为key值。(实用)

Qt图形视图框架:QGraphicsItem详解(长文)_第8张图片

Qt图形视图框架:QGraphicsItem详解(长文)_第9张图片

实际上每个图形项的数据都保存在静态全局对象里的。(知识点:Q_GLOBAL_STATIC宏的作用是创建静态全局对象)

16、QTransform deviceTransform(const QTransform &viewportTransform)

返回转换后的矩阵。例:

    item = new sliderGraphicsPixmapItem("",Qt::Horizontal);
    gphs->addItem(item);
    item->setPos(40,40);
    
    qDebug()<deviceTransform(gphv->viewportTransform()).map(QPointF(0, 0));
    auto transf = gphv->viewportTransform();
    transf.scale(0.5,0.5);
    gphv->setTransform(transf);
    qDebug()<deviceTransform(gphv->viewportTransform()).map(QPointF(0, 0));

点(0,0)在经过视图的视口转换矩阵处理后在视图中所处的位置。

17、qreal effectiveOpacity()

获取有效不透明度。此值是图形项自身的不透明度及其父级和祖先级不透明度的组合。

18、void ensureVisible(const QRectF &rect = QRectF(), int xmargin = 50, int ymargin = 50)

尝试滚动视图以确保rect在视图的视口内可见。 如果rect为空rect(默认值),则默认为图形项的外接矩形。 xmargin和ymargin是视图用于页边距的像素数。如果无法达到指定的矩形,则将内容滚动到最近的有效位置。如果QGraphicsView不能查看此图形项,则此功能不执行任何操作。例:

Qt图形视图框架:QGraphicsItem详解(长文)_第10张图片

19、QGraphicsItem *focusItem()

获取当前图形项的子项或子孙项中获得输入焦点的项。

20、void grabKeyboard()

抓取键盘输入。图形项A将接收到场景的所有键盘输入,直到发生以下事件之一:

  • 变得不可见
  • 从场景中删除
  • 被删除
  • 调用ungrabKeyboard()
  • 图形项B调用grabKeyboard();当图形项B调用ungrabKeyboard()时,图形项A将重新抓取键盘输入。

当图形项抓取键盘输入时,它将收到QEvent::GrabKeyboard事件。当它失去键盘输入时,它会收到QEvent::UngrabKeyboard事件。这些事件可用于通过获取输入焦点以外的其他方式检测图形项何时获得或失去键盘控制权。几乎没有必要在Qt中显式地抓住键盘,因为Qt会智能地抓住并释放它。只有可见的图形项才能获取键盘输入。在不可见的图形项上调用grabKeyboard()无效。

21、void grabMouse()

抓住鼠标输入。图形项A将接收该场景的所有鼠标事件,直到发生以下任何事件:

  • 变得不可见
  • 从场景中删除
  • 目被删除
  • 调用ungrabMouse()
  • 图形项B调用grabMouse();当图形项B调用ungrabMouse()时,图形项A将重新获得鼠标抓取。

当图形项抓取鼠标输入时,它将收到QEvent::GrabMouse事件。当失去鼠标抓取时,它将收到QEvent::UngrabMouse事件。这些事件可用于通过接收鼠标按钮事件以外的其他方式检测图形项何时获得或失去鼠标抓取。几乎没有必要在Qt中显式地抓住鼠标,因为Qt会智能地抓住并释放它。当按下鼠标按钮时,Qt会抓住鼠标,并保持抓住鼠标,直到释放最后一个鼠标按钮为止。请注意,只有可见的图形项才能抓取鼠标输入。在不可见的图形项上调用grabMouse()无效。

22、bool hasFocus()

失去焦点返回false,获得焦点返回true。

23、void installSceneEventFilter(QGraphicsItem *filterItem)

在filterItem上为当前图形项安装一个事件过滤器,使当前图形项的所有事件首先转发到filterItem的sceneEventFilter()函数交给它过滤传递处理。

24、bool isActive() 

图形项是否处于活动状态。仅当场景处于活动状态时,图形项才能处于活动状态。只有活动图形项才能获得输入焦点。

25、bool isAncestorOf(const QGraphicsItem*child)

如果当前图形项是参数图形项的祖先则返回true。

26、bool isBlockedByModalPanel(QGraphicsItem**blockingPanel = nullptr) 

如果当前图形项被模态面板阻止,则返回true,否则返回false。如果blockingPanel不为nullptr,则将blockingPanel设置为阻止此图形项的模态面板。如果此图形项未被阻止,则此功能将不会设置blockingPanel。对于不在场景中的图形项,此函数始终返回false。

27、bool isClipped() 

如果图形项被裁剪,则返回true。如果图形项设置了ItemClipsToShape标志,或其任何祖先设置了ItemClipsChildrenToShape标志,则该图形项将被裁剪。

28、bool isObscured(const QRectF &rect = QRectF())

如果rect被其上方任何碰撞图形项的不透明形状完全遮盖(即,Z值高于当前图形项),则返回true。(实用)

29、bool isObscuredBy(const QGraphicsItem*item)

如果当前图形项的边界矩形完全被参数中的图形项的不透明形状遮盖,则返回true。基本实现将图形项的opaqueArea()映射到该图形项的坐标系,然后检查该图形项的boundingRect()是否完全包含在映射的形状中。可以重新实现此功能,以提供一种自定义算法来确定该图形项是否被图形项遮盖。

30、bool isPanel()

图形项是否是面板。

31、bool isSelected()

图形项是否被选中。

32、bool isUnderMouse()

如果图形项当前是否位于一个视图鼠标光标的下方。(实用)

33、bool isVisibleTo(const QGraphicsItem *parent)

当前图形项是否对参数中的父项可见(即使isVisible()为true,也可能对其祖先不可见。即使isVisible()为false,它的祖先也可能可见)。参数parent可以为空的情况下,此函数将返回当前图形项对于场景是否可见。如果任何祖先被隐藏,则图形项本身将被隐式隐藏,在这种情况下,此函数将返回false。

34、bool isWidget()

当前图形项是否是QGraphicsWidget

35、bool isWindow()

当前图形项是否是QGraphicsWidget窗口。(QGraphicsWidget对象设置了 windowFlagsQt::Window

36、QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)

图形项状态改变的通知。见上面1.2。

37、QTransform itemTransform(const QGraphicsItem*other, bool *ok = nullptr)

返回一个QTransform,它将该图形项的坐标映射到其他图形项。如果ok不为nullptr,并且没有这种转换,则ok=false。例:

    QGraphicsProxyWidget * item = new QGraphicsProxyWidget();
    item->setWidget(new QPushButton("xx"));
    item->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
    gphs->addItem(item);
    item->setPos(50,50);

    DiscButtonGraphicsPixmapItem * item2 = new DiscButtonGraphicsPixmapItem();
    gphs->addItem(item2);
    item2->setPos(150,150);

    bool ok;
    auto trsf = item2->itemTransform(item,&ok);
    qDebug()<

38、void moveBy(qreal dx, qreal dy)

水平移动dx点,垂直移动dy点。此函数等效于调用setPos(pos()+ QPointF(dx,dy))。

39、QPainterPath opaqueArea() (虚函数)

返回一个形状,该形状表示图形项的不透明区域。如果使用不透明的笔刷填充该区域,则该区域是不透明的。默认实现返回一个空的QPainterPath,指示该图形项是完全透明的。

40、void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) (纯虚函数)

以图形项坐标绘制图形项的内容。在QGraphicsItem子类中重新实现此函数,以使用painter提供图形项的绘画实现。option参数为图形项提供样式选项,例如其状态,暴露区域等。应确保将所有绘画限制在boundingRect()的边界内。

41、QGraphicsItem *panel()

返回图形项的面板,如果该图形项没有面板,则返回nullptr。如果该图形项是面板,它将自行返回。 否则,它将返回作为面板的最接近的祖先。

Qt图形视图框架:QGraphicsItem详解(长文)_第11张图片

42、QGraphicsItem *parentItem()

返回指向图形项父项的指针。

43、QGraphicsObject *parentObject()

返回指向图形项父项的指针,并将其转换为QGraphicsObject。如果父项不是QGraphicsObject,则返回nullptr。

44、QGraphicsWidget *parentWidget()

返回指向项的父小部件的指针。项的父小部件是最接近的QGraphicsWidget父项。

Qt图形视图框架:QGraphicsItem详解(长文)_第12张图片

45、QPointF pos()

返回图形项的原点(本地坐标(0,0))在父坐标中的位置。 如果图形项没有父项,返回其在场景坐标中的位置。

46、void prepareGeometryChange()

准备要更改图形项的几何形状。在更改图形项的边界矩形以保持QGraphicsScene的索引最新之前,请调用此函数。

47、void removeSceneEventFilter(QGraphicsItem *filterItem)

从事件过滤器中移除图形项。

48、void resetTransform()

将所有转换属性重置为其默认值。等效于调用setTransform(QTransform())。

49、QRectF sceneBoundingRect()

通过将sceneTransform()与boundingRect()组合在一起,以场景坐标形式返回图形项的边界矩形。

50、bool sceneEventFilter(QGraphicsItem *item, QEvent *event)

过滤item的事件event。在子类中重新实现此功能可以将当前图形项用作其他图形项的事件过滤器,从而在它们能够响应之前拦截发送给这些图形项的事件。重新实现必须返回true以防止对给定事件进行进一步处理,以确保不会将其传递给监视的图形项,或者返回false来指示事件应由事件系统进一步传播

51、QPointF scenePos()

返回图形项在场景坐标中的位置。 这等效于调用mapToScene(0,0)。

52、QTransform sceneTransform()

返回此图形项所在场景的转换矩阵。

53、void scroll(qreal dx, qreal dy, const QRectF &rect = QRectF())

用dx,dy滚动图形项的rect的区域。如果rect为空rect,则滚动图形项的边界rect。滚动后,该图形项将发布新暴露区域的更新。仅当启用QGraphicsItem::ItemCoordinateCache时才支持滚动。否则,调用此函数等效于调用update(rect)。

    item3->scroll(20,20);

Qt图形视图框架:QGraphicsItem详解(长文)_第13张图片

54、void setAcceptHoverEvents(bool enabled)

设置是否接受鼠标悬停事件。默认为不接受。

父项在他们的子项之前接受悬停进入事件,而在他们的子项之后接受离开事件。但是,如果光标进入子级,则父级不会收到悬停离开事件。父级将保持“悬停”状态,直到光标离开其区域(包括其子项区域)为止。

如果设置了父项处理子项事件,则父项将在光标经过其子项时接收悬停移动,拖动移动和放置事件,但不会接收到悬浮进入和悬浮离开事件。

55、void setAcceptedMouseButtons(Qt::MouseButtons buttons)

设置接受鼠标事件的鼠标按键。默认情况下,接受所有鼠标按键。如果某个图形项接受鼠标按钮,则在为该按键传递鼠标按下事件时,它将成为鼠标抓取器图形项。但是如果该图形项不接受鼠标按钮,则场景会将鼠标事件转发到它下面的第一个图形项。

56、void setActive(bool active)

如果active为true,并且场景为active,则图形项的面板将被激活。 否则,图形项的面板将被禁用。

如果图形项不是活动场景的一部分,则active将决定当该场景变为活动状态或将图形项添加到场景时面板发生什么情况。如果为true,则将图形项添加到场景或激活场景时,将激活图形项的面板。 否则,该图形项将保持不活动状态,而与场景的激活状态无关。

Qt图形视图框架:QGraphicsItem详解(长文)_第14张图片

57、void setBoundingRegionGranularity(qreal granularity)

设置边界区域boundingRegion()的粒度。介于0到1之间(包括0和1)的值。默认值为0(即最低的粒度,其中边界区域对应于图形项的边界矩形)。boundingRegion()使用粒度来计算图形项的边界区域的精细程度。

58、void setCacheMode(QGraphicsItem::CacheMode mode, const QSize &logicalCacheSize = QSize())

设置图形项缓存模式。参数2仅由ItemCoordinateCache模式使用,它描述了高速缓存缓冲区的分辨率。例如为QSize(100,100),则图形项将使自身适合图形内存中的100x100像素,而不管图形项本身的逻辑大小如何。默认情况下,使用的是boundingRect()的大小。

如果图形项要花费大量时间重新绘制自身,则缓存可以加快渲染速度。在某些情况下,缓存还会降低渲染速度,特别是当图形项花费的重绘时间少于从缓存中重绘的时间时。

启用缓存后,图形项的paint()函数通常会绘制到屏幕外的像素图缓存中。对于任何后续的重绘请求,图形视图框架将从缓存中重绘。

可能需要更改QPixmapCache的缓存限制以获得最佳性能。

启用缓存并不意味着仅在响应显式update()调用时才调用该图形项的paint()函数。例如,在内存压力下,Qt可能决定删除某些缓存信息;在这种情况下,即使没有update()调用(即就像没有启用缓存一样),也会调用图形项的paint()函数。

59、void setEnabled(bool enabled)

设置是否启用。禁用的图形项是可见的,但不会收到任何事件,并且无法获得焦点或被选中。

如果禁用父项,则其所有子项也将被禁用。如果启用父项,则所有子项都将被启用,除非已明确禁用它们(如果设置子项禁用,则在禁用其父项后再次启用父项该子项将不会重新启用)。

如果安装了事件过滤器,则仍然可以在将事件传递到图形项之前对其进行拦截。此机制将忽略图形项的启用状态

60、void setFiltersChildEvents(bool enabled)

如果enabled为true,则将图形项设置为过滤其所有子项的所有事件(即,将针对其任何子项的所有事件发送给图形项)。如果enabled为false,则图形项将仅处理其自身的事件。 默认值为false。

61、void setFocus(Qt::FocusReason focusReason = Qt::OtherFocusReason)

将键盘输入焦点赋该图形项。focusReason参数将传递到此函数生成的任何焦点事件中。 它用于说明引起图形项聚焦的原因。

只有设置了启用ItemIsFocusable标志的图形项才能接受键盘焦点。

如果图形项不可见,未处于活动状态或与场景无关,则不会立即获得输入焦点。

调用此函数的结果:当前图形项将获得焦点。 如果另一个图形项已经具有焦点,则该图形项将首先收到一个focusOutEvent事件,指示失去输入焦点。

焦点更改原因Qt::FocusReason

  • Qt::MouseFocusReason:鼠标动作。
  • Qt::TabFocusReason:tab键按下。
  • Qt::BacktabFocusReason:回退制表符,可能按下了Ctrl+tab或shift+tab。
  • Qt::ActiveWindowFocusReason:窗口系统切换了窗口的活动状态。
  • Qt::PopupFocusReason:应用程序打开/关闭一个弹出窗口,该弹出窗口获得/释放了键盘焦点。
  • Qt::ShortcutFocusReason:按下了快捷键。
  • Qt::MenuBarFocusReason:菜单栏获得焦点。
  • Qt::OtherFocusReason:其他原因。

62、void setFocusProxy(QGraphicsItem *item)

将参数中图形项的焦点代理设置为当前图形项。

如果图形项A具有焦点代理图形项B,则当该A获得输入焦点时,B将接收输入焦点。A本身仍将具有焦点(即hasFocus()将返回true),但只有B将接收键盘输入。

焦点代理本身可以具有焦点代理,依此类推。 在这种情况下,键盘输入将由最外层的焦点代理处理。

焦点代理图形项必须与当前图形项属于同一场景。

63、void setGraphicsEffect(QGraphicsEffect *effect)

设置图形特效。见:Qt图形特效

64、void setGroup(QGraphicsItemGroup *group)

将图形项添加到图形项组。如果group为nullptr,则当前图形项将从当前所在的组中删除。

65、void setOpacity(qreal opacity)

设置不透明度,介于0.0(透明)和1.0(不透明)之间。当前图形项的不透明度与父级和祖先级不透明度合并为有效的不透明度(起最终作用)。

默认情况下,不透明度从父级传播到子级,因此,如果父级的不透明度为0.5,而子级也为0.5,则子级的有效不透明度将为0.25。

opacity属性决定传递给paint()函数的painter的状态(注意paint()的参数:paint(QPainter *painter, ...),QPainter对象是传进来的,不是创建的)。如果设置了图形项缓存,则有效属性将在呈现时应用于图形项的缓存。

有两个图形项标志会影响图形项的不透明度与父项的组合方式:ItemIgnoresParentOpacityItemDoesntPropagateOpacityToChildren

注意:将图形项的不透明度设置为0不会使该图形项不可见(isVisible()返回来说true),但是该图形项将被视为不可见的图形项(不会接收到事件、不会包含在QGraphicsView::items()、QGraphicsScene::items返回的项中、可以保留焦点)。 

66、void setParentItem(QGraphicsItem *newParent)

设置父项。如果newParent为nullptr,则t图形项将成为顶级图形项。此函数会将图形项隐式添加到父级场景中。

在作为newParent祖先的项上调用此函数时的行为是未定义的。

67、void setPos(const QPointF &pos) / void setX(qreal x) / void setY(qreal y)

将图形项的位置设置为pos(在父坐标中)。对于没有父项的图形项则设置其在场景中的位置。/ 设置位置的 x / y坐标。

68、void setRotation(qreal angle)

设置绕Z轴的顺时针旋转角度(以度为单位)。负值则逆时针旋转。 通常,旋转角度在(-360,360)范围内,但是也可以在此范围之外设置值(例如370度的旋转与10度的旋转相同)。图形项绕其变换原点旋转,默认情况下为左上角(0,0)。可以通过调用setTransformOriginPoint()来选择其他转换原点。

Qt图形视图框架:QGraphicsItem详解(长文)_第15张图片

69、void setScale(qreal factor)

设置缩放比例因子。比例因子0.0将使该图形项折叠到单个点。 如果是负比例因子,则该图形项将被翻转和镜像(即旋转180度)。图形项绕其变换原点缩放,默认情况下为左上角(0,0)。 。 可以通过调用setTransformOriginPoint()来选择其他转换原点。

70、void setSelected(bool selected)

如果selected为true且图形项是可选的,则选中图形项。否则,图形项是未选中的。

如果selected为true,但图形项为不可见,禁用或无法选中,则此功能不执行任何操作。

如果图形项在组中,则此功能将切换整个组的选择状态。 如果选择了该组,则还将选择该组中的所有图形项,如果未选择该组,则不会选择该组中的任何图形项。

默认无法选中图形项。要启用选择,请设置ItemIsSelectable标志。

提供此功能是为了方便,允许单独切换图形项的所选状态。 但是,选择图形项的更常见方法是调用QGraphicsScene::setSelectionArea(),它将为场景中指定区域内的所有可见,启用和可选择的图形项调用此函数。

71、void setToolTip(const QString &toolTip)

设置工具提示文本。

72、void setTransform(const QTransform &matrix, bool combine = false)

设置变换矩阵。如果Combine为true,则将矩阵与当前矩阵合并。否则,矩阵将替换当前矩阵。(关于矩阵合并可查看QPainter详解中的第46个函数)

为了简化使用转换视图与图形项的交互,图形项提供了mapTo ...和mapFrom ...函数(见下面第4大点),可以在图形项坐标和场景坐标之间转换。

转换矩阵与图形项的rotation(),scale()和transformations()组合成一个组合的转换(都起作用),该转换将图形项的坐标系映射到其父项。

73、void setTransformOriginPoint(const QPointF &origin)

在图形项坐标中设置转换的原点。

74、void setVisible(bool visible)

设置图形项是否可见。默认情况下,图形项是可见的。

不可见的图形项不会被绘制,也不会收到任何事件。特别是,鼠标事件会直接穿过不可见的图形项,并传递到可能在后面的任何图形项。

不可见的图形项也是不可选择的,它们无法获得输入焦点。

如果某个图形项在抓取鼠标时(例如,正在接收鼠标事件时)变得不可见,它将自动丢失鼠标抓取,并且通过使该图形项再次可见也不会重新获得抓取;它必须重新按下鼠标才能重新获得鼠标抓取。

不可见的图形项也不会具有焦点,因此,如果该图形项在变得不可见时具有焦点,它将失去焦点,并且仅通过使该图形项再次可见并不会重新获得焦点。

如果隐藏父项,则其所有子项也将被隐藏。如果显示父项,则将显示所有子项,除非已将它们显式隐藏。

75、void setZValue(qreal z)

设置Z值。Z值决定同级(相邻)图形项的堆叠顺序。Z值较高的同级项将始终被绘制在Z值较低的另一同级项的顶部。

76、QPainterPath shape() 

以局部坐标形式返回图形项的形状。该形状有多种用途,包括碰撞检测、QGraphicsScene::items()函数等。默认实现调用boundingRect()返回简单的矩形形状,但是子类可以重新实现此函数以为非矩形图形项返回更准确的形状。例如,圆形图形项可以选择返回椭圆形以更好地进行碰撞检测。例如:

  QPainterPath RoundItem::shape() const
  {
      QPainterPath path;
      path.addEllipse(boundingRect());
      return path;
  }

77、void stackBefore(const QGraphicsItem *sibling)

在当前图形项前面堆叠参数中的图形项(要求两个图形项必须共享相同的父项,或者都必须是顶级图形项)。当前图形项必须与参数中的图形项有相同的Z值,否则调用此函数将无效。默认情况下,所有同级图形项都按插入顺序堆叠(即添加的第一个图形项在添加的下一个图形项之前绘制)。如果两个图形项的Z值不同,则会在顶部绘制Z值最高的图形项。当Z值相同时,插入顺序将决定堆叠顺序。

    item = new QGraphicsRectItem(30,30,40,40);
    item->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
    gphs->addItem(item);
    item->setBrush(Qt::red);
    item->setPos(100,100);

    item2 = new QGraphicsRectItem(30,30,40,40);
    item2->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
    gphs->addItem(item2);
    item2->setPos(120,120);
    item2->setBrush(Qt::blue);

    item2->stackBefore(item);

 Qt图形视图框架:QGraphicsItem详解(长文)_第16张图片




78、QGraphicsObject *toGraphicsObject() (实用)

如果该类实际上是QGraphicsObject,则将图形项转成QGraphicsObject。

79、QGraphicsItem *topLevelItem()

返回图形项的顶级图形项。顶级图形项是其父项为nullptr的图形项项的最高级祖先项。如果某项没有父项,则返回其自身的指针(即顶级项是其自身的顶级项)。

Qt图形视图框架:QGraphicsItem详解(长文)_第17张图片

80、QGraphicsWidget *topLevelWidget()

返回图形项的顶级窗口小部件的指针(即,其祖先的父级为nullptr或其父级不是窗口小部件的指针),如果图形项没有顶层窗口小部件,则返回nullptr。如果图形项是顶级窗口小部件,则此函数返回指向图形项本身的指针。

Qt图形视图框架:QGraphicsItem详解(长文)_第18张图片

81、int type()

以int形式返回图形项的类型。所有标准的图形项类都与一个唯一值相关联。qgraphicsitem_cast()使用此类型信息来区分类型。默认实现返回UserType(65536)

自定义项要使用qgraphicsitem_cast()需要重新实现此函数,并声明一个Type枚举值,该值等于自定义项的类型。自定义项必须返回一个大于或等于UserType(65536)的值。例:

  class CustomItem : public QGraphicsItem
  {
  public:
     enum { Type = UserType + 1 };

     int type() const override
     {
         return Type;
     }
  };

82、void update(const QRectF &rect = QRectF())

重绘图形项中rect覆盖的区域。每当需要重绘图形项时(例如更改外观或大小),都可以调用此函数。如果该项不可见(即isVisible()返回false),则此函数不执行任何操作。

83、QGraphicsWidget *window()

返回图形项的窗口,如果图形项没有窗口,则返回nullptr。 如果图形项是一个窗口,它将返回自身。否则,它将返回最接近的祖先窗口。

Qt图形视图框架:QGraphicsItem详解(长文)_第19张图片

三、事件成员函数

1、void contextMenuEvent(QGraphicsSceneContextMenuEvent *event)

上下文菜单事件。默认实现是忽略该事件。如果忽略事件(即通过调用QEvent::ignore()),事件将传播到图形项下的任何图形项。 如果没有图形项接受该事件,则该事件将被场景忽略并传播到视图。打开QMenu以响应接收到上下文菜单事件是很常见的。例:

 void CustomItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
 {
     QMenu menu;
     QAction *removeAction = menu.addAction("Remove");
     QAction *markAction = menu.addAction("Mark");
     QAction *selectedAction = menu.exec(event->screenPos());
     // ...
 }

2、void dragEnterEvent(QGraphicsSceneDragDropEvent *event)

拖拽进入事件。拖拽时光标进入图形项区域时,将生成拖拽进入事件。通过接受事件(即通过调用QEvent::accept()),图形项除了接受拖拽移动和拖拽离开之外,还将接受放置事件。默认情况下,图形项不接收拖放事件,要启用此功能,请调用setAcceptDrops(true)。例:

 CustomItem::CustomItem()
 {
     setAcceptDrops(true);
     ...
 }

 void CustomItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
 {
     event->setAccepted(event->mimeData()->hasFormat("text/plain"));
 }

3、void dragLeaveEvent(QGraphicsSceneDragDropEvent *event)

拖拽离开事件。拖拽光标离开图形项区域时,将生成拖动离开事件。在事件上调用QEvent::ignore()或QEvent::accept()无效。

4、void dragMoveEvent(QGraphicsSceneDragDropEvent *event)

拖拽移动事件。拖拽光标在图形项区域内四处移动时,将生成拖拽移动事件。在事件上调用QEvent::ignore()或QEvent::accept()可以切换图形项是否接受事件发生位置的拖拽放下。

5、void dropEvent(QGraphicsSceneDragDropEvent *event)

拖拽放下事件。在事件中调用QEvent::ignore()或QEvent::accept()无效。

图形项关于拖拽的处理流程和方式和QWidget是一致的,见:Qt拖放

6、void focusInEvent(QFocusEvent *event)

获取焦点事件。

7、void focusOutEvent(QFocusEvent *event)

失去焦点事件。

Qt图形视图框架:QGraphicsItem详解(长文)_第20张图片

8、void hoverEnterEvent(QGraphicsSceneHoverEvent *event)

鼠标悬停进入事件。默认实现调用是update()。在此事件中调用QEvent::ignore()或QEvent::accept()无效。必须设置setAcceptHoverEvents(true)。

9、void hoverLeaveEvent(QGraphicsSceneHoverEvent *event)

鼠标悬停离开事件。默认实现调用是update()。

10、void hoverMoveEvent(QGraphicsSceneHoverEvent *event)

鼠标悬停移动事件。默认实现不执行任何操作。在此事件中调用QEvent::ignore()或QEvent::accept()无效。

11、void inputMethodEvent(QInputMethodEvent *event)

输入法事件。拉丁语直接是输入字母的,输入法事件是针对非拉丁语使用输入法输入内容的事件。默认实现是忽略该事件。

12、void keyPressEvent(QKeyEvent *event)

按键按下事件。默认实现忽略该事件。如果重新实现此处理程序,则默认情况下将接受该事件。注意,只有设置了ItemIsFocusable标志并且具有键盘输入焦点的图形项才会收到该事件。

13、void keyReleaseEvent(QKeyEvent *event)

按键松开事件。默认实现忽略该事件。如果重新实现此处理程序,则默认情况下将接受该事件。注意,只有设置了ItemIsFocusable标志并且具有键盘输入焦点的图形项才会收到该事件。

14、void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)

鼠标双击事件。双击某个图形项时,该图形项将首先收到鼠标按下事件,然后是释放事件(即单击),然后是双击事件,最后是释放事件。

在此事件中调用QEvent::ignore()或QEvent::accept()无效。

默认实现调用mousePressEvent()。

如果一个图形项既不可选择又不可移动,则它将不会收到双击事件(在这种情况下,单次鼠标单击将被忽略,这将停止双击事件的生成)。

15、void mouseMoveEvent(QGraphicsSceneMouseEvent *event)

鼠标按下之后的移动事件。如果确实收到此事件,在此事件中调用QEvent::ignore()或QEvent::accept()无效。默认实现处理基本的图形项交互,例如选择和移动。

16、void mousePressEvent(QGraphicsSceneMouseEvent *event)

鼠标按下事件。鼠标按下事件仅传递给接受按下鼠标按钮的图形项。默认情况下,图形项接受所有鼠标按钮,但是可以通过调用setAcceptedMouseButtons()来更改它。

如果不重新实现此功能,则按下事件将传播到该图形项下面的任何最顶层图形项,并且其他鼠标事件都不会传递到该图形项。

如果确实重新实现此功能,则默认情况下将接受事件(QEvent::accept()),然后该图形项将成为鼠标捕获器。这使该图形项可以接收将来的移动,释放和双击事件。

如果在事件上调用QEvent::ignore(),则该图形项将失去鼠标抓取,并且事件将传播到下面的顶层图形项。

默认实现处理基本的图形项交互,例如选择和移动。

对于既不可移动又不可选择的图形项,事件为QEvent::ignore()。

 17、void mouseReleaseEvent(QGraphicsSceneMouseEvent *event)

鼠标释放事件。在此事件中调用QEvent::ignore()或QEvent::accept()无效。默认实现处理基本的图形项交互,例如选择和移动。

18、bool sceneEvent(QEvent *event)

接收图形项的事件。重新实现此函数以在将事件分派到专用事件处理函数(上面的各种事件)之前对其进行拦截。如果事件已被正确识别(识别出是哪种类型的事件)并在此函数处理了,则返回true;否则,返回false。

19、void wheelEvent(QGraphicsSceneWheelEvent *event)

鼠标滚轮事件。如果重新实现此功能,则默认情况下将接受事件。如果忽略该事件(即通过调用QEvent::ignore()),它将传播到图形项下面的任何图形项。如果没有图形项接受该事件,则该事件将被场景忽略,并传播到视图(例如,视图的垂直滚动条)。默认实现忽略该事件。

四、坐标映射成员函数

4.1、mapFromItem

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

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

    QGraphicsRectItem * item = new QGraphicsRectItem(30,30,40,40);
    item->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
    gphs->addItem(item);
    item->setPos(100,100);

    QGraphicsRectItem * item2 = new QGraphicsRectItem(30,30,40,40);
    item2->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
    gphs->addItem(item2);
    item2->setPos(120,120);
    qDebug()<mapFromItem(item2,QPointF(10,10));

Qt图形视图框架:QGraphicsItem详解(长文)_第21张图片

获取B中的点在A中的映射位置。

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

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

    qDebug()<mapFromItem(item2,QRect(10,10,10,10));

Qt图形视图框架:QGraphicsItem详解(长文)_第22张图片

获取B中的矩形在A中的映射位置。

3、QPolygonF mapFromItem(const QGraphicsItem *item, const QPolygonF &polygon)

与2类似,映射多边形。

4、QPainterPath mapFromItem(const QGraphicsItem *item, const QPainterPath &path)

与2类似,映射路径。

4.2、mapFromParent

1、QPointF mapFromParent(const QPointF &point)

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

Qt图形视图框架:QGraphicsItem详解(长文)_第23张图片

例:

    item = new QGraphicsRectItem(30,30,40,40);
    item->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
    gphs->addItem(item);
    item->setPos(100,100);

    item2 = new QGraphicsRectItem(30,30,40,40);
    item2->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
    gphs->addItem(item2);
    item2->setPos(120,120);

    item2->setParentItem(item);
    qDebug()<mapFromParent(QPointF(10,10));

Qt图形视图框架:QGraphicsItem详解(长文)_第24张图片

2、QPolygonF mapFromParent(const QRectF &rect)

与1类似,映射矩形。返回值与4.1中的2类似。

3、QPolygonF mapFromParent(const QPolygonF &polygon)

与1类型,映射多边形。

4、QPainterPath mapFromParent(const QPainterPath &path)

与1类型,映射路径。

4.3、mapFromScene

1、QPointF mapFromScene(const QPointF &point)

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

Qt图形视图框架:QGraphicsItem详解(长文)_第25张图片

Qt图形视图框架:QGraphicsItem详解(长文)_第26张图片

2、QPolygonF mapFromScene(const QRectF &rect) 

与1类似,映射矩形。返回值与4.1中的2类似。

3、QPolygonF mapFromScene(const QPolygonF &polygon)

与1类似,映射多边形。

4、QPainterPath mapFromScene(const QPainterPath &path)

与1类型,映射路径。

4.4、mapRectFromItem

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

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

    qDebug()<mapRectFromItem(item2,QRect(10,10,10,10));
    qDebug()<mapFromItem(item2,QRect(10,10,10,10));

可见返回的区域是相同的。

4.5、mapRectFromParent

1、QRectF mapRectFromParent(const QRectF &rect)

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

    qDebug()<mapFromParent(QRect(10,10,10,10));
    qDebug()<mapRectFromParent(QRect(10,10,10,10));

 

可见返回的区域是相同的。

4.6、mapRectFromScene

1、QRectF mapRectFromScene(const QRectF &rect)

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

4.7、mapRectToItem

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

mapRectFromItem()(4.4)相反。

Qt图形视图框架:QGraphicsItem详解(长文)_第27张图片

  • mapRectFromItem():矩形在B中求它映射到A中的位置。
  • mapRectToItem():矩形在A中求它在B中的位置。

例:

    item = new QGraphicsRectItem(30,30,40,40);
    item->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
    gphs->addItem(item);
    item->setPos(100,100);

    item2 = new QGraphicsRectItem(30,30,40,40);
    item2->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
    gphs->addItem(item2);
    item2->setPos(120,120);
    qDebug()<<"mapRectFromItem  "<mapRectFromItem(item2,QRect(10,10,10,10));
    qDebug()<<"mapRectToItem    "<mapRectToItem(item2,QRect(10,10,10,10));

Qt图形视图框架:QGraphicsItem详解(长文)_第28张图片

4.8、mapRectToParent

1、QRectF mapRectToParent(const QRectF &rect) 

mapRectFromParent()(4.5)相反。

  • mapRectFromParent():将父项中的矩形映射到当前图形项中。
  • mapRectToParent():将当前图形项的矩形映射到父项中。

4.9、mapRectToScene

1、QRectF mapRectToScene(const QRectF &rect) 

mapRectFromScene()(4.6)相反。

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

4.10、mapToItem

以下4个函数和4.1(mapFromItem)4个函数对应相反的(从名字可以看出来)。

1、QPointF mapToItem(const QGraphicsItem *item, const QPointF &point) 

Qt图形视图框架:QGraphicsItem详解(长文)_第29张图片

  • mapFromItem():点在B中求它映射到A中的位置。
  • mapToItem():点在A中求它映射到B中的位置。

2、QPolygonF mapToItem(const QGraphicsItem *item, const QRectF &rect)

与1类似,映射矩形。

3、QPolygonF mapToItem(const QGraphicsItem *item, const QPolygonF &polygon)

与1类型,映射多边形。

4、QPainterPath mapToItem(const QGraphicsItem *item, const QPainterPath &path)

与1类型,映射路径。

4.11、mapToParent

以下4个函数和4.2(mapFromParent)4个函数对应相反的(从名字可以看出来)。

1、QPointF mapToParent(const QPointF &point)

Qt图形视图框架:QGraphicsItem详解(长文)_第30张图片

  • mapFromParent():父项中的点映射到子项的坐标系。
  • mapToParent():子项中的点映射到父项的坐标系。

2、QPolygonF mapToParent(const QRectF &rect)

与1类似,映射矩形。

3、QPolygonF mapToParent(const QPolygonF &polygon)

与1类似,映射多边形。

4、QPainterPath mapToParent(const QPainterPath &path)

与1类似,映射路径。

4.12、mapToScene

以下4个函数和4.3(mapFromScene)4个函数对应相反的(从名字可以看出来)。

1、QPointF mapToScene(const QPointF &point)

  • mapFromScene():将场景中的点映射为坐标系的点。
  • mapToScene():将坐标系的点映射为场景中的点。

2、QPolygonF mapToScene(const QRectF &rect)

与1类似,映射矩形。

3、QPolygonF mapToScene(const QPolygonF &polygon)

与1类似,映射多边形。

4、QPainterPath mapToScene(const QPainterPath &path)

与1类似,映射路径。

五、类型转换

 1、T qgraphicsitem_cast(QGraphicsItem *item)

如果图形项为T类型,则返回给定的类型T类型的图形项;否则返回nullptr。自定义图形项要正常使用此函数必须重新实现type()函数。 

Qt图形视图框架:QGraphicsItem详解(长文)_第31张图片

你可能感兴趣的:(#,Qt图形视图框架,qt)