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

项的所有几何信息均基于其局部坐标系。该项目的位置pos()是唯一不在本地坐标中运行的函数,因为它返回了父坐标中的位置。图形视图坐标系详细描述了坐标系。
您可以通过调用setVisible()设置项目是否应可见(即,绘制并接受事件)。隐藏项目也会隐藏其子项。同样,您可以通过调用setEnabled()启用或禁用项目。如果禁用某个项目,则其所有子项也将被禁用。默认情况下,项目既可见又启用。若要切换是否选择项目,请首先通过设置ItemIsSelectable标志启用选择,然后调用setSelected()。通常,作为用户交互的结果,场景会切换选择。
要编写自己的图形项目,首先创建QGraphicsItem的子类,然后从实现其两个纯虚拟公共函数开始:boundingRect()返回该项目所绘制区域的估计值,paint()实现实际绘画。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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()的调用。
项目可以包含其他项目,也可以包含在其他项目中。所有项目都可以具有父项目和子项列表。除非该项目没有父对象,否则它的位置是父对象的坐标(即父对象的本地坐标)。父项将其位置和转换都传播给所有子项。
