scene类的很多成员函数返回的是QGraphicsItem类,这是所有item类的基类。但是如果程序中存在自定义Item类,就需要进行类型检测与转换了。
常见的比如说items函数,返回的就是QList<QGrahicsItem *>。如果我们自定义了两个Item,ItemA和ItemB,那么这个QList就会混合着ItemA和ItemB,要如何区分他们呢?
QGraphicsItem 中包含两个与类型相关的枚举值。
enum {
Type = 1,
UserType = 65536
};
const int QGraphicsItem::Type
Qt 中标准图形项类中的虚函数 type() 返回的类型值。Qt 中的所有此类标准图形项类都与 Type 的唯一值相关联,例如,QGraphicsPathItem::type() 返回的值为 2。
class QGraphicsPathItem : public QAbstractGraphicsShapeItem
{
public:
enum { Type = 2 };
int type() const { return Type; }
...
};
标准图形项包括:矩形(QGraphicsRectItem)、椭圆(QGraphicsEllipseItem)、文本(QGraphicsTextItem)等多个图形项。
const int QGraphicsItem::UserType
如果是自定义Item,就需要自己重新定义Type。UserType自定义项(QGraphicsItem 或任何标准项的子类)允许的最低值。此值与重新实现 QGraphicsItem::type() 并声明 Type 枚举值结合使用。例:
class CustomItem : public QGraphicsItem
{
public:
enum { Type = UserType + 1 };
int type() const
{
return Type;
}
...
};
自定义Item可以加1,加2,一直加下去,自己做好区分就好。
T qgraphicsitem_cast(QGraphicsItem *item)
如果项类型为 T,则返回给定的项强制转换为类型 T;否则,将返回 0。
要使此函数能够与自定义项一起正常工作,请为每个自定义 QGraphicsItem 子类重新实现 type() 函数。
使用示例
foreach (QGraphicsItem *item, scene()->items()) {
Node *node = qgraphicsitem_cast<Node *>(item);
if (!node)
continue;
Node是一个自定义的Item,qgraphicsitem_cast<Node *>(item)如果item是Node这个类型,那就将QGraphicsItem类型Item转换为Node类型Item,如果不是就返回0.