由于 qgraphicsscene 和 qgraphicsitem 的大多数便利函数例如items()selecteditems()、collidingitems()、childitems()返回一个 <code>qlist<qgraphicsitem *></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。