天天看点

QGraphicsItem的类型检测与转换简述类型检测类型转换实际应用

由于 qgraphicsscene 和 qgraphicsitem 的大多数便利函数例如items()selecteditems()、collidingitems()、childitems()返回一个 <code>qlist&lt;qgraphicsitem *&gt;</code> 列表在遍历列表的时候通常需要对其中的 qgraphicsitem 进行类型检测与转换以确定实际的 item。

<a href="#%e7%ae%80%e8%bf%b0">简述</a>

<a href="#%e7%b1%bb%e5%9e%8b%e6%a3%80%e6%b5%8b">类型检测</a>

<a href="#qgraphicsitemtype">qgraphicsitemtype</a>

<a href="#qgraphicsitemusertype">qgraphicsitemusertype</a>

<a href="#%e7%b1%bb%e5%9e%8b%e8%bd%ac%e6%8d%a2">类型转换</a>

<a href="#%e5%ae%9e%e9%99%85%e5%ba%94%e7%94%a8">实际应用</a>

qgraphicsitem 中包含两个与类型相关的枚举值

qgraphicsitem::type 是标准 item 类中 virtual type() 函数返回的类型值。所有标准 item 与唯一的 type 值相关联。例如qgraphicspathitem::type() 返回的值为 2。

其他标准 item 类似type 分别为 3、4、5……

qgraphicsitem::usertype 是自定义 itemqgraphicsitem 或任何标准 item 的子类的最小允许类型值。该值与 qgraphicsitem::type() 的重新实现结合使用并声明一个 type 枚举值。例如

注意要使 qgraphicsitem_cast 与自定义 item 一起正常工作需要为其重新实现 type() 函数。

t qgraphicsitem_cast(qgraphicsitem *item)

如果 item 是类型 t返回指定 item 转换为类型 t否则返回 0。

下面以获取 qgraphicsscene 中的所有 items 为例

首先根据 type() 判断 item 的类型。然后通过 qgraphicsitem_cast 进行转换。这样既可以访问标准 item也可以通过 qgraphicsproxywidget 访问 qwidget以及访问自定义 item。