QT(14):QGraphicsItem

一、QGraphicsItem

为编写自己的自定义item提供了轻量级基础。通过其事件处理程序定义item的几何图形、碰撞检测、其绘制实现和item交互。
QGraphicsEllipseItem,椭圆item
QGraphicsLineItem,线item
QGraphicsPathItem,路径item
QGraphicsPixmapItem,像素图item
QGraphicsPolygonItem,多边形item
QGraphicsRectItem,矩形item
QGraphicsSimpleTextItem,简单文本item
QGraphicsTextItem,文本item

item的所有几何信息都基于其局部坐标系。item的位置pos()是唯一不在本地坐标中运行的函数,因为它返回父坐标中的位置。

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

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

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

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

碰撞检测可以通过两种方式完成

  • 重新实现shape()以返回item的准确形状,并依靠collidesWithItem()的默认实现来执行形状-形状交集。如果形状很复杂,这可能会相当昂贵。
  • 重新实现collidesWithItem()以提供您自己的自定义item和形状冲突算法。

可以调用contains()函数来确定item是否包含点。此函数也可以由item重新实现。contains()的默认行为基于调用shape()。

item可以包含其他item,也可以由其他item包含。所有item都可以具有父item和子item列表。除非item没有父item,否则其位置位于父坐标(即父item的本地坐标)中。父item将其位置和转换传播到所有子item。

转换
QGraphicsItem 除了支持其基本位置pos()之外还支持投影变换。有几种方法可以更改item的转换。

  • 对于简单转换,可以调用函数setRotation()或setScale()之一。
  • 也可以将任何转换矩阵传递给setTransform()。
  • 对于高级变换控制,您还可以选择通过调用setTransformations()来设置多个组合变换。

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

某些转换操作会产生不同的结果,具体取决于它们的应用顺序。例如,如果缩放转换,然后旋转它,则可能会得到与先旋转转换不同的结果。但是,在 QGraphicsItem 上设置转换属性的顺序不会影响生成的转换;QGraphicsItem 始终以固定的、定义的顺序应用属性。

绘制
QGraphicsView调用paint()函数以绘制item的内容。该item没有自己的背景或默认填充,无论后面是什么,item都会照亮此函数中未明确绘制的所有区域。可以调用update()来调用重绘,可以选择传递需要重绘的矩形区域。根据item在视图中是否可见,可能会也可能不会重新绘制,在 QGraphicsItem 中没有类似于QWidget::repaint()。

item由视图绘制,从父item开始,然后按堆叠顺序升序绘制子item。可以通过调用 setZValue()来设置item的堆叠顺序,并通过调用zValue()对其进行测试,其中 z 值较低的item在 z 值较高的item之前绘制。堆叠顺序适用于同级item,父item总是在他们的子item之前被绘制。

排序
所有item都以定义的顺序绘制,单击场景时,同样的顺序决定了哪些item将首先接收鼠标输入。
item的子item堆叠在父item的顶部,同级item按添加顺序堆叠(即和item被添加到场景中或添加到同一父item的顺序相同)。如果添加item A,然后添加 B,则 B 将位于 A 之上。如果随后添加 C,则项目的堆叠顺序将是 A,然后是 B,然后是 C。

通过多种方式更改item的排序方式:
可以对item调用setZValue(),以将其显式堆叠在其他同级item之上或下方。item的默认 Z 值为0。具有相同 Z 值的item按添加顺序堆叠。
可以调用stackBefore()对子item列表重新排序。这将直接修改堆叠顺序。
可以设置ItemStacksBehindParent 标志,将子item堆叠在其父项后面。
两个同级item的堆叠顺序也延续到每个item的子item和后代item中。因此,如果一个item位于另一个item之上,则其所有子item也将位于另一个item的子item之上。

事件
QGraphicsItem从QGraphicsScene中通过虚函数sceneEvent()接收事件。此函数将最常见的事件分发到具体的事件处理程序。

自定义数据
有时,将自定义数据注册到item(无论是自定义item还是标准item)很有用。您可以使用键值对(键是整数,值是QVariant)。若要从item中获取自定义数据,调用data()。Qt本身完全没有使用此功能,它是为了方便用户而提供的。

二、枚举类型

enum QGraphicsItem::CacheMode,item的缓存模式。缓存用于通过分配和呈现到屏幕外像素缓冲区来加速渲染,当项目需要重绘时,可以重复使用该缓冲区。对于某些绘画设备,缓存直接存储在图形内存中,这使得渲染非常快。
enum QGraphicsItem::GraphicsItemChange, QGraphicsItem::itemChange()通知的状态更改。通知在状态更改时发送,在某些情况下,可以进行调整。
enum QGraphicsItem::GraphicsItemFlag,在item上设置的不同标志,以切换itme行为中的不同功能。
enum QGraphicsItem::PanelModality,指定模式面板的行为。模式面板是阻止对其他面板的输入的面板。
enum QGraphicsItem::anonymous,标准图形项类中的虚函数type()返回的值。Qt中所有此类标准图形项类都与Type的唯一值相关联。

boundingRect,这个纯虚函数将item的外部边界定义为矩形,所有绘画都必须限制在item的边界内。用于确定item是否需要重绘。尽管item的形状可以是任意的,但边界矩形始终是矩形的,并且不受item转换的影响。
boundingRegion,返回此item的边界区域。比boundingRect更精确。
boundingRegionGranularity,返回item的边界区域粒度。介于0和1之间的值。默认值为0。
cacheMode,返回此item的缓存模式。默认模式是NoCache(即禁用缓存并且所有绘制都是即时的)。

childItems,返回此item的子item的列表。
childrenBoundingRect,返回此item的后代在局部坐标中的边界矩形。此函数的复杂性是线性的,它通过遍历所有后代来确定返回的边界矩形的大小。
clearFocus,清除焦点。
clipPath,返回此item的剪辑路径,如果未剪切此item,则返回空路径。剪辑路径约束项目的外观和交互(即,限制项目可以绘制和接收事件的区域,如将矩形剪辑为椭圆)。
collidesWithItem,如果当前item与给定item冲突,则返回true,否则返回false。
collidesWithPath,如果当前item与给定path冲突,则返回true。
collidingItems,返回与当前item冲突的所有item的列表。
commonAncestorItem,返回当前item和给定item的最接近的共同祖先项。
contains,如果当前item包含局部坐标点返回true。常被QGraphicsView调用来获取光标指向的item。
data(int key),返回自定义数据。键为int,值为QVariant。
ensureVisible,如果此item是由QGraphicsView查看的场景的一部分,则此函数将尝试滚动视图以确保给定矩形区域在视图的viewport中可见。
focusItem,如果此item、此item的子item或后代item当前具有输入焦点,则此函数将返回指向该item的指针。
focusProxy,返回此项的焦点代理
grabKeyboard,该项目将接收场景的所有键盘输入
grabMouse,此项将接收场景的所有鼠标事件

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值