图形视图(04):【类】QGraphicsItem [官翻]

QGraphicsItem 类

QGraphicsItem类是QGraphicsScene中所有图形项的基类。

Header:#include < QGraphicsItem >
qmake:QT += widgets
Inherits:
Inherited By:QAbstractGraphicsShapeItem, QGraphicsItemGroup, QGraphicsLineItem,
QGraphicsObject, QGraphicsPixmapItem
Since:Qt 4.2

详述

它为编写您自己的自定义项目提供了一个轻量级的基础。 这包括定义项目的几何形状,碰撞检测,其绘画实现以及通过事件处理程序进行的项目交互。 QGraphicsItem是Graphics View Framework的一部分。

img

为方便起见,Qt为最常见的形状提供了一组标准图形项目。 这些是:

  • QGraphicsEllipseItem 提供一个椭圆项
  • QGraphicsLineItem 提供一个线条项
  • QGraphicsPathItem 提供一个任意路径项
  • QGraphicsPixmapItem 提供一个像素图项
  • QGraphicsPolygonItem 提供一个多边形项目
  • QGraphicsRectItem 提供一个矩形项目
  • QGraphicsSimpleTextItem 提供一个简单的文本标签项
  • QGraphicsTextItem 提供了一个高级文本浏览器项

项的所有几何信息均基于其局部坐标系。项目的位置pos() 是唯一不在本地坐标中运行的函数,因为它在父坐标中返回一个位置。图形视图坐标系详细描述了坐标系。

您可以通过调用setVisible() 设置项目是否应可见(即,绘制并接受事件)。隐藏项目也会隐藏其子项。同样,您可以通过调用setEnabled() 启用或禁用项目。如果禁用某个项目,则其所有子项也将被禁用。默认情况下,项目既可见又启用。若要切换是否选择项目,请首先通过设置ItemIsSelectable标志启用选择,然后调用setSelected() 。通常,作为用户交互的结果,场景会切换选择。

要编写自己的图形项,首先要创建QGraphicsItem的子类,然后从实现其两个纯虚拟公共函数开始:boundingRect() 返回该项目绘制的面积的估计值,paint() 实现实际绘画。例如:

 class SimpleItem : public QGraphicsItem
 {
 public:
     QRectF boundingRect() const override
     {
         qreal penWidth = 1;
         return QRectF(-10 - penWidth / 2, -10 - penWidth / 2,
                       20 + penWidth, 20 + penWidth);
     }

     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                QWidget *widget) override
     {
         painter->drawRoundedRect(-10, -10, 20, 20, 5, 5);
     }
 };

boundingRect() 函数具有许多不同的用途。 QGraphicsScene的项目索引基于boundingRect() ,而QGraphicsView则使用它来剔除不可见的项目,并确定绘制重叠项目时需要重新组合的区域。此外,QGraphicsItem的冲突检测机制使用boundingRect() 提供有效的截止点。 collidesWithItem() 中的细粒度碰撞算法基于调用shape() 的方法,该方法返回项目形状的准确轮廓作为QPainterPath。

QGraphicsScene期望所有项目boundingRect() 和shape() 保持不变,除非得到通知。如果要以任何方式更改项目的几何形状,则必须首先调用prepareGeometryChange() 以允许QGraphicsScene更新其簿记。

冲突检测可以通过两种方式完成:

  • 重新实现shape() 以为您的项目返回准确的形状,并依靠collidesWithItem() 的默认实现来进行形状与形状的交点。如果形状复杂,这可能会非常昂贵。
  • 重新实现collidesWithItem() 以提供您自己的自定义项目和形状碰撞算法。

可以调用contains() 函数来确定该项目是否包含一个点。该功能也可以通过项重新实现。 contains() 的默认行为是基于调用shape() 的。

项目可以包含其他项目,也可以包含在其他项目中。所有项目都可以有一个父项和一个子项列表。除非该项目没有父对象,否则它的位置是父对象的坐标(即父对象的本地坐标)。父项将其位置和转换都传播给所有子项。

img

变换

QGraphicsItem除了其基本位置pos() 外,还支持投影变换。有几种更改项目转换的方法。对于简单的转换,可以调用便捷函数setRotation() 或setScale() ,也可以将任何转换矩阵传递给setTransform() 。对于高级转换控制,您还可以通过调用setTransformations() 来设置多个组合转换。

项转换从父项到子项累积,因此,如果父项和子项都旋转90度,则子项的总转换将为180度。同样,如果项目的父项缩放到其原始大小的2倍,则其子项也将扩大两倍。项的变换不会影响其自身的局部几何形状。所有几何函数(例如,contains() ,update() 和所有映射函数)仍在局部坐标下运行。为了方便起见,QGraphicsItem提供了函数SceneTransform() 和ScenePos() ,该函数返回项的总转换矩阵(包括其位置以及所有父项的位置和转换),并返回其在场景坐标中的位置。要重置项目的矩阵,请调用resetTransform() 。

某些转换操作会根据其应用顺序产生不同的结果。例如,如果缩放转换然后旋转,则可能会得到与首先旋转转换不同的结果。但是,您在QGraphicsItem上设置转换属性的顺序不会影响最终的转换。 QGraphicsItem始终以固定的定义顺序应用属性:

  • 应用项目的基本变换(transform() )
  • 项目的转换列表按顺序应用(transformations() )
  • 相对于其变换原点(rotation() ,transformOriginPoint() )旋转项目
  • 相对于其变换原点(scale() ,transformOriginPoint() )缩放该项目

绘制

QGraphicsView调用paint() 函数来绘制项目的内容。 该项目没有背景,也没有默认填充内容。 该项目后面的所有内容都会在此功能中未明确绘制的所有区域中发光。 您可以调用update() 安排重新绘制,可以选择传递需要重新绘制的矩形。 根据项目是否在视图中可见,该项目可能会被重新粉刷,也可能不会被重新粉刷。 在QGraphicsItem中没有等效于QWidget :: repaint() 的对象。

项目是按视图绘制的,从父项开始,然后以升序堆叠子项。 您可以通过调用setZValue() 设置项目的堆叠顺序,并通过调用zValue() 对其进行测试,z值较低的项目在z值较高的项目之前被绘制。 堆叠顺序适用于同级物品; 父母总是在孩子面前被吸引。

排序

所有项目均按定义的稳定顺序绘制,并且此相同的顺序决定了当您单击场景时哪些项目将首先接收鼠标输入。 通常,您不必担心排序,因为项目遵循“自然顺序”,遵循场景的逻辑结构。

项的子项堆叠在父项的顶部,兄弟项按照插入顺序堆叠(即,按照它们添加到场景或添加到同一父项的顺序)。 如果先添加项目A,然后再添加B,则B将位于A的顶部。如果然后添加C,则项目的堆叠顺序将是A,然后是B,然后是C。

img

本示例从“拖放机器人”示例中显示了机器人所有肢体的堆叠顺序。躯干是根项(所有其他项是躯干的子代或后代),因此首先绘制它。接下来,绘制头部,因为它是躯干孩子列表中的第一项。然后绘制左上臂。由于下臂是上臂的子代,因此先绘制下臂,然后是上臂的下一个兄弟姐妹,即右上臂,依此类推。

对于高级用户,有一些方法可以更改项目的排序方式:

  • 您可以在一个项目上调用setZValue() ,以将其显式堆叠在其他同级项目之上或之下。项的默认Z值为0。具有相同Z值的项按插入顺序堆叠。
  • 可以调用stackBefore() 重新排序子级列表。这将直接修改插入顺序。
  • 您可以设置ItemStacksBehindParent标志以将子项堆叠在其父项之后。

两个同级项的堆叠顺序也计入每个项的子项和后代项。因此,如果一项在另一项之上,则其所有子项也将在另一项所有子项之上。

事件

QGraphicsItem通过虚拟函数sceneEvent() 从QGraphicsScene接收事件。此函数将最常见的事件分配给一组便捷事件处理程序:

  • contextMenuEvent() 处理上下文菜单事件
  • focusInEvent() 和focusOutEvent() 处理焦点入和出事件
  • hoverEnterEvent() ,hoverMoveEvent() 和hoverLeaveEvent() 处理悬停进入,移动和离开事件
    inputMethodEvent() 处理输入事件,以支持可访问性
  • keyPressEvent() 和keyReleaseEvent() 处理按键按下和释放事件
  • mousePressEvent() ,mouseMoveEvent() ,mouseReleaseEvent() 和mouseDoubleClickEvent() 处理鼠标的按下,移动,释放,单击和双击事件

您可以通过安装事件过滤器来过滤任何其他项目的事件。此功能与Qt的常规事件过滤器(请参阅QObject :: installEventFilter() )分开,后者仅适用于QObject的子类。在通过调用installSceneEventFilter() 将项目安装为另一个项目的事件过滤器之后,虚拟函数sceneEventFilter() 将接收过滤的事件。您可以通过调用removeSceneEventFilter() 来删除项目事件过滤器。

自定义数据

有时,用一个项注册自定义数据是很有用的,无论是自定义项还是标准项。可以对任何项调用setData(),使用键-值对(键是一个整数,值是一个QVariant)在其中存储数据。要从项中获取自定义数据,调用data()。这个功能完全不受Qt本身的影响;它是为了方便用户而提供的。

参见QGraphicsScene, QGraphicsView和图形视图框架。

公共类型

enum CacheMode

该enum描述QGraphicsItem的缓存模式。缓存通过分配和呈现到屏幕外像素缓冲区来加速呈现,当项目需要重绘时,可以重用该像素缓冲区。对于一些绘制设备,缓存直接存储在图形内存中,这使得渲染非常快。

ConstantValueDescription
NoCache0默认;禁用所有项缓存。每次项目需要重绘时调用QGraphicsItem::paint()。
ItemCoordinateCache1为项的逻辑(本地)坐标系统启用缓存。QGraphicsItem创建一个可配置大小/分辨率的屏幕外像素缓冲区,您可以传递给QGraphicsItem::setCacheMode()。渲染质量通常会降低,这取决于缓存的分辨率和项转换。第一次重绘项时,它将自己呈现到缓存中,然后缓存将在以后的每次公开中重用。在转换项时,缓存也会被重用。要调整缓存的分辨率,可以再次调用setCacheMode()。
DeviceCoordinateCache2缓存是在绘制设备级别的设备坐标中启用的。此模式适用于可以移动但不旋转、缩放或剪切的项目。如果条目被直接或间接转换,缓存将自动重新生成。与ItemCoordinateCacheMode不同,DeviceCoordinateCache总是以最高质量呈现。

参见QGraphicsItem: setCacheMode()。

enum GraphicsItemChange

该enum描述由QGraphicsItem::itemChange()通知的状态变化。通知在状态更改时发送,在某些情况下,还可以进行调整(有关每个更改的详细信息,请参阅文档)。

注意:在itemChange()内部调用QGraphicsItem本身上的函数时要小心,因为某些函数调用可能导致不必要的递归。例如,你不能在itemChange()中对ItemPositionChange通知调用setPos(),因为setPos()函数将再次调用itemChange(ItemPositionChange)。相反,您可以从itemChange()返回调整后的新位置。

ConstantValueDescription
ItemPositionChange0项目的位置改变了。如果启用了ItemSendsGeometryChanges标志,并且当项目的局部位置相对于其父位置发生变化时(即,由于调用setPos()或moveBy()),则发送此通知。value参数是新的位置(即QPointF)。您可以调用pos()来获得原始位置。在发送此通知时,不要在itemChange()中调用setPos()或movby ();相反,您可以从itemChange()返回调整后的新位置。在此通知之后,如果位置发生变化,QGraphicsItem将立即发送ItemPositionHasChanged通知。
ItemMatrixChange1项目的仿射变换矩阵正在变化。这个值过时了;您可以使用ItemTransformChange代替。
ItemVisibleChange2项的可见状态改变了。如果物品现在是可见的,它将变成不可见的,反之亦然。value参数是新的可见状态(即,true或false)。在发送此通知时,不要在itemChange()中调用setVisible();相反,您可以从itemChange()返回新的可见状态。
ItemEnabledChange3项目的启用状态改变。如果该项目前是启用的,它将被禁用,反之亦然。参数value是新的启用状态(即true或false)。在发送此通知时,不要在itemChange()中调用setEnabled()。相反,您可以从itemChange()返回新的状态。
ItemSelectedChange4项目的选中状态改变。如果项目目前已被选中,则它将被取消选中,反之亦然。value参数是新选择的状态(即,true或false)。在发送此通知时,不要在itemChange()中调用setSelected();相反,您可以从itemChange()返回新选定的状态。
ItemParentChange5项目的父项改变。value参数是新的父项(即一个QGraphicsItem指针)。在发送此通知时,不要在itemChange()中调用setParentItem();相反,您可以从itemChange()返回新的父对象。
ItemChildAddedChange6将一个子项添加到此项中。value参数是新的子项(即QGraphicsItem指针)。当发送此通知时,不要将此项目传递给任何项目的setParentItem()函数。返回值未被使用;您无法调整此通知中的任何内容。请注意,在发送此通知时,新子节点可能还没有完全构造好;在子节点上调用纯虚函数可能会导致崩溃。
ItemChildRemovedChange7从该项中删除子项。value参数是将要被删除的子项(即QGraphicsItem指针)。返回值未被使用;您无法调整此通知中的任何内容。
ItemTransformChange8项的变换矩阵改变了。如果启用了ItemSendsGeometryChanges标志,并且当项目的局部转换矩阵发生变化时(即,由于调用setTransform()),将发送此通知。value参数是新矩阵(即一个QTransform);要得到旧的矩阵,调用transform()。在发送此通知时,不要调用setTransform()或在itemChange()中设置任何转换属性;相反,您可以从itemChange()返回新的矩阵。如果更改转换属性,则不会发送此通知。
ItemPositionHasChanged9物品的位置已经改变。如果启用了ItemSendsGeometryChanges标志,并且在项目的本地位置(相对于其父位置)发生变化之后,就会发送此通知。value参数是新的位置(与pos()相同),QGraphicsItem忽略该通知的返回值(即只读通知)。
ItemTransformHasChanged10由于调用了setTransform,或者其中一个转换属性发生了变化,项目的转换矩阵发生了变化。如果启用了ItemSendsGeometryChanges标志,并且在项目的局部转换矩阵更改之后,将发送此通知。value参数是新矩阵(与transform()相同),QGraphicsItem忽略此通知的返回值(即只读通知)。
ItemSceneChange11物品被移动到一个新的场景。当项目被添加到它的初始场景时,这个通知也被发送,当它被删除时。项目的scene()是旧场景,如果项目还没有添加到场景中,则为nullptr。value参数是新场景(即QGraphicsScene指针),如果项目从场景中删除,则为nullptr。当发送此通知时,不要通过将此项目传递给QGraphicsScene::addItem()来覆盖此更改;相反,你可以从itemChange()返回新的场景。请谨慎使用此功能;反对场景更改会很快导致不必要的递归。
ItemVisibleHasChanged12项的可见状态已更改。value参数是新的可见状态(即,true或false)。发送此通知时,不要在itemChange()中调用setVisible()。返回值将被忽略。
ItemEnabledHasChanged13项目的启用状态已更改。参数value是新的启用状态(即true或false)。在发送此通知时,不要在itemChange()中调用setEnabled()。返回值将被忽略。
ItemSelectedHasChanged14项目的选中状态已更改。value参数是新选择的状态(即,true或false)。在发送此通知时,不要在itemChange()中调用setSelected()。返回值将被忽略。
ItemParentHasChanged15项目的父项已经更改。value参数是新的父元素(即指向QGraphicsItem的指针)。发送此通知时,不要在itemChange()中调用setParentItem()。返回值将被忽略。
ItemSceneHasChanged16物品的场景发生了变化。道具的场景()是新场景。当项目被添加到它的初始场景时,这个通知也被发送,当它被删除时。value参数是新场景(即指向QGraphicsScene的指针)。在发送通知时,不要在itemChange()中调用setScene()。返回值将被忽略。
ItemCursorChange17项目的光标改变。value参数是新的游标(即QCursor)。在发送此通知时,不要在itemChange()中调用setCursor()。相反,您可以从itemChange()返回一个新的游标。
ItemCursorHasChanged18项目的光标已经改变。value参数是新的游标(即QCursor)。发送此通知时不要调用setCursor()。返回值将被忽略。
ItemToolTipChange19项目的工具提示改变。value参数是新的工具提示(即QToolTip)。在发送此通知时,不要在itemChange()中调用setToolTip()。相反,您可以从itemChange()返回一个新的工具提示。
ItemToolTipHasChanged20物品的工具提示改变了。value参数是新的工具提示(即QToolTip)。发送此通知时不要调用setToolTip()。返回值将被忽略。
ItemFlagsChange21项目的标志改变了。value参数是新的标志(即quint32)。在发送此通知时,不要在itemChange()中调用setFlags()。相反,您可以从itemChange()返回新的标志。
ItemFlagsHaveChanged22项目的标志已经改变。value参数是新的标志(即quint32)。在发送此通知时,不要在itemChange()中调用setFlags()。返回值将被忽略。
ItemZValueChange23物品的z值改变了。value参数是新的z值(即double)。发送此通知时,不要在itemChange()中调用setZValue()。相反,您可以从itemChange()返回一个新的z值。
ItemZValueHasChanged24物品的z值已经改变。value参数是新的z值(即double)。发送此通知时不要调用setZValue()。返回值将被忽略。
ItemOpacityChange25项目的不透明度改变。value参数是新的不透明度(即double)。发送此通知时,不要在itemChange()中调用setOpacity()。相反,您可以从itemChange()返回一个新的不透明度。
ItemOpacityHasChanged26项目的不透明度已经改变。value参数是新的不透明度(即double)。发送此通知时不要调用setOpacity()。返回值将被忽略。
ItemScenePositionHasChanged27物品的场景位置改变了。如果启用了ItemSendsScenePositionChanges标志,并且在项目的场景位置发生了变化(例如,项目本身的位置或转换,或者任何祖先的位置或转换发生了变化)之后,这个通知就会发送。value参数是新的场景位置(与scenePos()相同),QGraphicsItem忽略此通知的返回值(即只读通知)。
ItemRotationChange28项目的旋转属性改变。如果启用了ItemSendsGeometryChanges标志,以及当项目的旋转属性发生变化(即,由于调用setRotation())时,将发送此通知。value参数是新的旋转(即double);要获得旧的旋转,调用rotation()。在发送此通知时,不要在itemChange()中调用settrotation ();相反,您可以从itemChange()返回新的旋转。
ItemRotationHasChanged29项目的旋转属性已经改变。如果启用了ItemSendsGeometryChanges标志,并且在项目的旋转属性改变之后,这个通知就会发送。value参数是新的旋转(即double), QGraphicsItem忽略该通知的返回值(即只读通知)。在发送此通知时,不要在itemChange()中调用settrotation()。
ItemScaleChange30项目的scale属性改变。如果启用了ItemSendsGeometryChanges标志,以及当项目的scale属性发生变化时(即,由于调用setScale()),这个通知就会发送。value参数是新的刻度(即double);调用scale()来获取旧的刻度。在发送此通知时,不要在itemChange()中调用setScale();相反,您可以从itemChange()返回新的比例。
ItemScaleHasChanged31项目的规模属性已经改变。如果启用了ItemSendsGeometryChanges标志,并且在项目的scale属性改变之后,这个通知就会发送。value参数是新的刻度(即double),而QGraphicsItem忽略该通知的返回值(即只读通知)。在发送此通知时,不要在itemChange()中调用setScale()。
ItemTransformOriginPointChange32项目的transform origin point属性改变。如果启用了ItemSendsGeometryChanges标志,并且当项目的transform origin point属性发生变化时(即,由于调用setTransformOriginPoint()),则发送此通知。value参数是新的原点(即QPointF);要获得旧的原点,请调用transformOriginPoint()。在发送此通知时,不要在itemChange()中调用setTransformOriginPoint();相反,您可以从itemChange()返回新的转换起点。
ItemTransformOriginPointHasChanged33项目的transform origin point属性已更改。如果启用了ItemSendsGeometryChanges标志,并且在项目的transform origin point属性更改之后,将发送此通知。value参数是新的起源

enum GraphicsItemFlag

flags GraphicsItemFlags

此枚举描述了您可以在项目上设置的不同标志,以切换项目行为中的不同特性。
默认情况下,所有标志都是禁用的。

ConstantValueDescription
ItemIsMovable0x1该项目支持使用鼠标进行交互式移动。通过单击项目然后拖动,项目将随着鼠标光标一起移动。如果项目有子项目,则也会移动所有子项目。如果项目是选定项目的一部分,则也将移动所有选定的项目。这个特性是通过QGraphicsItem的鼠标事件处理程序的基本实现提供的。
ItemIsSelectable0x2项目支持选择。启用此功能将使setSelected()能够切换项目的选择。通过单击一个项目,或者在QGraphicsView中使用橡皮筋选择,它还将让项目在调用QGraphicsScene::setSelectionArea()后自动被选中。
ItemIsFocusable0x4该项目支持键盘输入焦点(即,它是一个输入项目)。启用此标志将允许项目接受焦点,这再次允许向QGraphicsItem::keyPressEvent()和QGraphicsItem::keyReleaseEvent()传递键事件。
ItemClipsToShape0x8项目剪辑成它自己的形状。该项目不能在其形状之外绘制或接收鼠标、平板、拖放或悬停事件。默认为禁用。QGraphicsView::drawItems()或QGraphicsScene::drawItems()强制执行此行为。这个标志是Qt 4.3中引入的。
ItemClipsChildrenToShape0x10该项目将其所有后代的画作剪辑成自己的形状。作为该项的直接或间接子项的项不能在该项的形状之外绘制。默认情况下,此标志是禁用的;孩子们可以在任何地方画画。QGraphicsView::drawItems()或QGraphicsScene::drawItems()强制执行此行为。这个标志是Qt 4.3中引入的。

注意:这个标志类似于ItemContainsChildrenInShape,但还通过剪切子元素来强制包含。

ConstantValueDescription
ItemIgnoresTransformations0x20项目忽略继承的转换(即,它的位置仍然锚定到它的父类,但是父类或视图旋转、缩放或剪切转换被忽略)。这个标志对于保持文本标签项水平和未缩放很有用,所以如果视图被转换,它们仍然是可读的。设置后,项目的视图几何和场景几何将被分开维护。你必须调用deviceTransform()来映射坐标并检测视图中的冲突。缺省情况下,禁用此标志。这个标志是Qt 4.3中引入的。

注意:通过设置这个标志,你仍然可以缩放项目本身,而且这个缩放转换将影响项目的子项目。

ConstantValueDescription
ItemIgnoresParentOpacity0x40该项目忽略其父项目的不透明度。项目的有效不透明度与其本身相同;它不与父节点的不透明度相结合。这个标志允许你的项目保持绝对不透明度,即使父项目是半透明的。这个标志是在Qt 4.5中引入的。
ItemDoesntPropagateOpacityToChildren0x80项目不会将其不透明度传播给它的子项目。此标志允许您创建不影响其子元素不透明度的半透明项。这个标志是在Qt 4.5中引入的。
ItemStacksBehindParent0x100条目被堆放在其父条目的后面。默认情况下,子项堆叠在父项的顶部。但在这面旗帜上,孩子会被堆在它后面。这个标志对于投影效果和跟随父项的几何体而不在其上绘制的装饰对象是有用的。这个标志是在Qt 4.5中引入的。
ItemUsesExtendedStyleOption0x200项目在QStyleOptionGraphicsItem中使用exposedirect或matrix。默认情况下,exposedirect被初始化为项目的boundingRect(),而矩阵没有被转换。您可以启用此标志,以便用更细粒度的值设置样式选项。注意,QStyleOptionGraphicsItem::levelOfDetail不受此标志的影响,并且总是初始化为1。如果你需要一个更高的值,可以使用QStyleOptionGraphicsItem::levelOfDetailFromTransform()。这个标志是在Qt 4.6中引入的。
ItemHasNoContents0x400该项目不会绘制任何东西(即,在该项目上调用paint()没有效果)。您应该在不需要绘制的项上设置此标志,以确保图形视图避免不必要的绘制准备。这个标志是在Qt 4.6中引入的。
ItemSendsGeometryChanges0x800项目启用itemChange()通知ItemPositionChange、ItemPositionHasChanged、ItemTransformChange、ItemTransformHasChanged、ItemRotationChange、ItemRotationHasChanged、ItemScaleChange、ItemScaleHasChanged、ItemTransformOriginPointChange和ItemTransformOriginPointHasChanged。出于性能原因,这些通知在默认情况下是禁用的。必须启用此标志才能接收位置和转换更改的通知。这个标志是在Qt 4.6中引入的。
ItemAcceptsInputMethod0x1000该项支持通常用于亚洲语言的输入法。这个标志是在Qt 4.6中引入的。
ItemNegativeZStacksBehindParent0x2000如果它的z值为负,项目会自动堆叠在它的父项目后面。这个标志启用setZValue()来切换ItemStacksBehindParent。这个标志是在Qt 4.6中引入的。
ItemIsPanel0x4000该项目是一个面板。面板提供激活和包含的焦点处理。一次只能激活一个面板(参见QGraphicsItem::isActive())。当没有面板激活时,QGraphicsScene激活所有非面板项目。窗口项(例如,QGraphicsItem::isWindow()返回true)是面板。这个标志是在Qt 4.6中引入的。
ItemSendsScenePositionChanges0x10000项目启用ItemScenePositionHasChanged的itemChange()通知。出于性能原因,这些通知在默认情况下是禁用的。你必须启用这个标志来接收场景位置改变的通知。这个标志是在Qt 4.6中引入的。
ItemContainsChildrenInShape0x80000该标志表明,项目的所有直接或间接子项目仅在项目的形状内绘制。与ItemClipsChildrenToShape不同,这个限制不强制执行。当您手动确保绘图已绑定到项目的形状,并且希望避免与强制剪辑相关的成本时,设置itemcontainchildreninshape。设置此标志可以更有效地绘制和碰撞检测。缺省情况下,该标志是关闭的。

注意:如果同时设置了这个标志和ItemClipsChildrenToShape,则剪切将被强制执行。这等价于设置ItemClipsChildrenToShape。这个标志是在Qt 5.4中引入的。

enum PanelModality

此枚举指定模态面板的行为。模态面板是将输入阻塞到其他面板的面板。注意,模态面板的子项目不会被阻塞。

ConstantValueDescription
NonModal0面板不是模态的,不会阻塞其他面板的输入。这是面板的默认值。
PanelModal1该面板对单个项目层次结构是模态的,并阻止输入到其父面板、所有祖父面板以及其父面板和祖父面板的所有兄弟面板。
SceneModal2该窗口对整个场景是模态的,并阻塞所有面板的输入。

参见QGraphicsItem::setPanelModality(), QGraphicsItem::panelModality()和QGraphicsItem:: itempanel。

enum anonymous

Qt中的标准图形项类中的virtual type()函数返回的值。所有这些标准图形项类都与type的唯一值相关联,例如QGraphicsPathItem::type()函数返回的值是2。

ConstantValueDescription
Type1class QGraphicsPathItem : public QAbstractGraphicsShapeItem
{
public:
enum { Type = 2 };
int type() const override { return Type; }

};
UserType65536由virtual type()函数为QGraphicsItem的自定义子类返回的最小值。
class CustomItem : public QGraphicsItem
{
public:
enum { Type = UserType + 1 };

int type() const override
{
// Enable the use of qgraphicsitem_cast with this item.
return Type;
}

};

公共函数

构造析构

  1. QGraphicsItem(QGraphicsItem *parent = nullptr)
  2. virtual ~QGraphicsItem()

类型相关

  1. QGraphicsItem::CacheMode cacheMode() const

  2. void setCacheMode(QGraphicsItem::CacheMode mode, const QSize &logicalCacheSize = QSize())

  3. QGraphicsItem::PanelModality panelModality() const

  4. void setPanelModality(QGraphicsItem::PanelModality panelModality)

  5. virtual int type() const

交互

  1. bool acceptDrops() const
  2. void setAcceptDrops(bool on)
  3. bool acceptHoverEvents() const
  4. void setAcceptHoverEvents(bool enabled)
  5. bool acceptTouchEvents() const
  6. void setAcceptTouchEvents(bool enabled)
  7. Qt::MouseButtons acceptedMouseButtons() const
  8. void setAcceptedMouseButtons(Qt::MouseButtons buttons)
  9. Qt::InputMethodHints inputMethodHints() const
  10. void setInputMethodHints(Qt::InputMethodHints hints)

特殊

  1. virtual void advance(int phase)
  2. QPainterPath clipPath() const
  3. bool isClipped() const
  4. bool isBlockedByModalPanel(QGraphicsItem **blockingPanel = nullptr) const
  5. bool isEnabled() const
  6. void setEnabled(bool enabled)
  7. bool isSelected() const
  8. void setSelected(bool selected)
  9. bool isUnderMouse() const
  10. bool isWidget() const
  11. bool isWindow() const
  12. QGraphicsScene * scene() const
  13. QGraphicsObject * toGraphicsObject()
  14. const QGraphicsObject * toGraphicsObject() const
  15. QString toolTip() const
  16. void setToolTip(const QString &toolTip)
  17. QGraphicsWidget * window() const

边界相关

  1. virtual QRectF boundingRect() const = 0
  2. QRegion boundingRegion(const QTransform &itemToDeviceTransform) const
  3. virtual bool contains(const QPointF &point) const
  4. virtual QPainterPath shape() const
  5. qreal boundingRegionGranularity() const
  6. void setBoundingRegionGranularity(qreal granularity)
  7. QRectF childrenBoundingRect() const
  8. QRectF sceneBoundingRect() const

层次关系

  1. QList<QGraphicsItem *> childItems() const
  2. QGraphicsItem * parentItem() const
  3. void setParentItem(QGraphicsItem *newParent)
  4. QGraphicsObject * parentObject() const
  5. QGraphicsWidget * parentWidget() const
  6. QGraphicsItem * topLevelItem() const
  7. QGraphicsWidget * topLevelWidget() const
  8. QGraphicsItem * commonAncestorItem(const QGraphicsItem *other) const
  9. bool isAncestorOf(const QGraphicsItem *child) const

焦点

  1. void clearFocus()
  2. bool hasFocus() const
  3. void setFocus(Qt::FocusReason focusReason = Qt::OtherFocusReason)
  4. QGraphicsItem * focusItem() const
  5. QGraphicsItem * focusProxy() const
  6. void setFocusProxy(QGraphicsItem *item)

碰撞

  1. virtual bool collidesWithItem(const QGraphicsItem *other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
  2. virtual bool collidesWithPath(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
  3. QList<QGraphicsItem *> collidingItems(Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const

光标

  1. QCursor cursor() const
    void setCursor(const QCursor &cursor)
  2. bool hasCursor() const
  3. void unsetCursor()

数据

  1. QVariant data(int key) const
  2. void setData(int key, const QVariant &value)

变换

  1. QTransform deviceTransform(const QTransform &viewportTransform) const
  2. QTransform itemTransform(const QGraphicsItem *other, bool *ok = nullptr) const
  3. QTransform transform() const
    void setTransform(const QTransform &matrix, bool combine = false)
    void resetTransform()
  4. qreal rotation() const
    void setRotation(qreal angle)
  5. qreal scale() const
    void setScale(qreal factor)
  6. void scroll(qreal dx, qreal dy, const QRectF &rect = QRectF())
  7. QPointF transformOriginPoint() const
    void setTransformOriginPoint(const QPointF &origin)
    void setTransformOriginPoint(qreal x, qreal y)
  8. QList<QGraphicsTransform *> transformations() const
    void setTransformations(const QList<QGraphicsTransform *> &transformations)
  9. QPointF scenePos() const
    QTransform sceneTransform() const

特效

  1. qreal effectiveOpacity() const
  2. qreal opacity() const
    void setOpacity(qreal opacity)
  3. QGraphicsEffect * graphicsEffect() const
    void setGraphicsEffect(QGraphicsEffect *effect)
  4. virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) = 0
  5. void update(const QRectF &rect = QRectF())
    void update(qreal x, qreal y, qreal width, qreal height)

视图

  1. void ensureVisible(const QRectF &rect = QRectF(), int xmargin = 50, int ymargin = 50)
  2. void ensureVisible(qreal x, qreal y, qreal w, qreal h, int xmargin = 50, int ymargin = 50)

事件

  1. bool filtersChildEvents() const
  2. void setFiltersChildEvents(bool enabled)
  3. void installSceneEventFilter(QGraphicsItem *filterItem)
  4. void removeSceneEventFilter(QGraphicsItem *filterItem)

标志

  1. QGraphicsItem::GraphicsItemFlags flags() const 返回此项目的标志
    这些标志描述了启用或不启用该项目的哪些可配置功能。 例如,如果标志包括ItemIsFocusable,则该项可以接受输入焦点。
    默认情况下,未启用任何标志。
  2. void setFlag(QGraphicsItem::GraphicsItemFlag flag, bool enabled = true) 设置单个项目标志
  3. void setFlags(QGraphicsItem::GraphicsItemFlags flags) 设置多个标志

键鼠

  1. void grabKeyboard()
  2. void ungrabKeyboard()
  3. void grabMouse()
  4. void ungrabMouse()

  1. QGraphicsItemGroup * group() const
  2. void setGroup(QGraphicsItemGroup *group)

可视

  1. void hide()
  2. void show()
  3. bool isVisible() const
  4. void setVisible(bool visible)
  5. bool isVisibleTo(const QGraphicsItem *parent) const
  6. bool isObscured(const QRectF &rect = QRectF()) const
  7. bool isObscured(qreal x, qreal y, qreal w, qreal h) const
  8. virtual bool isObscuredBy(const QGraphicsItem *item) const
  9. virtual QPainterPath opaqueArea() const

激活

  1. bool isActive() const
  2. QGraphicsItem * panel() const
  3. bool isPanel() const
  4. void setActive(bool active)

坐标变换

  1. QPointF mapFromItem(const QGraphicsItem *item, const QPointF &point) const
  2. QPolygonF mapFromItem(const QGraphicsItem *item, const QRectF &rect) const
  3. QPolygonF mapFromItem(const QGraphicsItem *item, const QPolygonF &polygon) const
  4. QPainterPath mapFromItem(const QGraphicsItem *item, const QPainterPath &path) const
  5. QPointF mapFromItem(const QGraphicsItem *item, qreal x, qreal y) const
  6. QPolygonF mapFromItem(const QGraphicsItem *item, qreal x, qreal y, qreal w, qreal h) const
  7. QPointF mapFromParent(const QPointF &point) const
  8. QPolygonF mapFromParent(const QRectF &rect) const
  9. QPolygonF mapFromParent(const QPolygonF &polygon) const
  10. QPainterPath mapFromParent(const QPainterPath &path) const
  11. QPointF mapFromParent(qreal x, qreal y) const
  12. QPolygonF mapFromParent(qreal x, qreal y, qreal w, qreal h) const
  13. QPointF mapFromScene(const QPointF &point) const
  14. QPolygonF mapFromScene(const QRectF &rect) const
  15. QPolygonF mapFromScene(const QPolygonF &polygon) const
  16. QPainterPath mapFromScene(const QPainterPath &path) const
  17. QPointF mapFromScene(qreal x, qreal y) const
  18. QPolygonF mapFromScene(qreal x, qreal y, qreal w, qreal h) const
  19. QRectF mapRectFromItem(const QGraphicsItem *item, const QRectF &rect) const
  20. QRectF mapRectFromItem(const QGraphicsItem *item, qreal x, qreal y, qreal w, qreal h) const
  21. QRectF mapRectFromParent(const QRectF &rect) const
  22. QRectF mapRectFromParent(qreal x, qreal y, qreal w, qreal h) const
  23. QRectF mapRectFromScene(const QRectF &rect) const
  24. QRectF mapRectFromScene(qreal x, qreal y, qreal w, qreal h) const
  25. QRectF mapRectToItem(const QGraphicsItem *item, const QRectF &rect) const
  26. QRectF mapRectToItem(const QGraphicsItem *item, qreal x, qreal y, qreal w, qreal h) const
  27. QRectF mapRectToParent(const QRectF &rect) const
  28. QRectF mapRectToParent(qreal x, qreal y, qreal w, qreal h) const
  29. QRectF mapRectToScene(const QRectF &rect) const
  30. QRectF mapRectToScene(qreal x, qreal y, qreal w, qreal h) const
  31. QPointF mapToItem(const QGraphicsItem *item, const QPointF &point) const
  32. QPolygonF mapToItem(const QGraphicsItem *item, const QRectF &rect) const
  33. QPolygonF mapToItem(const QGraphicsItem *item, const QPolygonF &polygon) const
  34. QPainterPath mapToItem(const QGraphicsItem *item, const QPainterPath &path) const
  35. QPointF mapToItem(const QGraphicsItem *item, qreal x, qreal y) const
  36. QPolygonF mapToItem(const QGraphicsItem *item, qreal x, qreal y, qreal w, qreal h) const
  37. QPointF mapToParent(const QPointF &point) const
  38. QPolygonF mapToParent(const QRectF &rect) const
  39. QPolygonF mapToParent(const QPolygonF &polygon) const
  40. QPainterPath mapToParent(const QPainterPath &path) const
  41. QPointF mapToParent(qreal x, qreal y) const
  42. QPolygonF mapToParent(qreal x, qreal y, qreal w, qreal h) const
  43. QPointF mapToScene(const QPointF &point) const
  44. QPolygonF mapToScene(const QRectF &rect) const
  45. QPolygonF mapToScene(const QPolygonF &polygon) const
  46. QPainterPath mapToScene(const QPainterPath &path) const
  47. QPointF mapToScene(qreal x, qreal y) const
  48. QPolygonF mapToScene(qreal x, qreal y, qreal w, qreal h) const

位置

  1. void moveBy(qreal dx, qreal dy)
  2. QPointF pos() const
  3. void setPos(const QPointF &pos)
  4. void setPos(qreal x, qreal y)
  5. qreal x() const
  6. qreal y() const
  7. void setX(qreal x)
  8. void setY(qreal y)
  9. qreal zValue() const
  10. void setZValue(qreal z)
  11. void stackBefore(const QGraphicsItem *sibling)

受保护的函数

  1. virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
  2. virtual void dragEnterEvent(QGraphicsSceneDragDropEvent *event)
  3. virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
  4. virtual void dragMoveEvent(QGraphicsSceneDragDropEvent *event)
  5. virtual void dropEvent(QGraphicsSceneDragDropEvent *event)
  6. virtual void focusInEvent(QFocusEvent *event)
  7. virtual void focusOutEvent(QFocusEvent *event)
  8. virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event)
  9. virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
  10. virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event)
  11. virtual void inputMethodEvent(QInputMethodEvent *event)
  12. virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const
  13. virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
  14. virtual void keyPressEvent(QKeyEvent *event)
  15. virtual void keyReleaseEvent(QKeyEvent *event)
  16. virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
  17. virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
  18. virtual void mousePressEvent(QGraphicsSceneMouseEvent *event)
  19. virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
  20. void prepareGeometryChange()
  21. virtual bool sceneEvent(QEvent *event)
  22. virtual bool sceneEventFilter(QGraphicsItem *watched, QEvent *event)
  23. void updateMicroFocus()
  24. virtual void wheelEvent(QGraphicsSceneWheelEvent *event)

相关的函数

  1. T qgraphicsitem_cast(QGraphicsItem *item)
  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现在场景和视图中拖动QGraphicsItem,可以按照以下步骤: 1. 创建一个继承自QGraphicsItem的自定义图形,并重写它的paint()函数和boundingRect()函数。 2. 在自定义图形中重写mousePressEvent()、mouseMoveEvent()和mouseReleaseEvent()三个鼠标事件函数,实现拖动操作。 3. 在QGraphicsView的构造函数中设置拖动模式为拖动项模式,即setDragMode(QGraphicsView::DragMode::ScrollHandDrag)。 4. 在QGraphicsScene中添加自定义图形的实例,并将其作为场景中的一个图形项。 下面是一个简单的示例代码,演示如何在场景和视图中拖动QGraphicsItem: ```c++ #include <QApplication> #include <QGraphicsView> #include <QGraphicsScene> #include <QGraphicsItem> class CustomItem : public QGraphicsItem { public: CustomItem() : QGraphicsItem() {} QRectF boundingRect() const override { return QRectF(0, 0, 100, 100); } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override { painter->setBrush(Qt::red); painter->drawEllipse(boundingRect()); } protected: void mousePressEvent(QGraphicsSceneMouseEvent *event) override { if (event->button() == Qt::LeftButton) { m_lastPos = event->scenePos(); event->accept(); } else { event->ignore(); } } void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override { if (event->buttons() & Qt::LeftButton) { QPointF delta = event->scenePos() - m_lastPos; moveBy(delta.x(), delta.y()); m_lastPos = event->scenePos(); event->accept(); } else { event->ignore(); } } void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override { if (event->button() == Qt::LeftButton) { event->accept(); } else { event->ignore(); } } private: QPointF m_lastPos; }; int main(int argc, char *argv[]) { QApplication a(argc, argv); QGraphicsScene scene; CustomItem *item = new CustomItem(); scene.addItem(item); QGraphicsView view(&scene); view.setDragMode(QGraphicsView::DragMode::ScrollHandDrag); view.show(); return a.exec(); } ``` 在这个示例代码中,我们创建了一个CustomItem,它继承自QGraphicsItem,并重写了paint()、boundingRect()和鼠标事件函数。在QGraphicsView的构造函数中,我们设置了拖动模式为拖动项模式,并将CustomItem实例添加到了QGraphicsScene中。这样,我们就可以在场景和视图中拖动CustomItem了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值