3

由于 QGraphicsScene 和 QGraphicsItem 的大多数便利功能(例如 items()、collidingItems()、childItems() 等)返回一个 QList,你不得不做很多 qgraphicsitem_cast 或 static_cast 和 QGraphicsItem::Type() 检查当场景中有很多不同类型的物品时,请掌握实际物品。我认为做很多子类转换不是一种理想的编码风格,但我想在这种情况下没有其他可行的方法,或者有吗?

QList<QGraphicsItem *> itemsHit = someItem->collidingItems(Qt::IntersectsItemShape);
foreach (QGraphicsItem *item, itemsHit) {
    if (item->type() == QGraphicsEllipseItem::type()) {
        QGraphicsEllipseItem *ellipse = qgraphicsitem_cast<QGraphicsEllipseItem *>(item);
        // do something
    }
    else if (item->type() == MyItemSubclass::type()) {
        MyItemSubClass *myItem = qgraphicsitem_cast<MyItemSubClass *>(item);
        // do something
    }
    // etc
}

上面的 qgraphicsitem_cast 可以用 static_cast 代替,因为正确的类型已经被验证。当一直在做很多这些(非常动态的场景)时,大量的演员会影响性能超出正常的 if-else 评估吗?

4

1 回答 1

0

性能开销大多是预付的;这是拥有 . type()成员。item->type()检索一次可能是有效的。你知道它不会改变,但编译器很可能不会改变。

[编辑] 另外,如果你真的有很多类型,那么引入一些中间类型可能是值得的。例如。if (dynamic_cast<MyGraphicsInterMediateType*>(item)) {/* check those types */} else {/* other types */}

于 2010-06-10T08:00:33.377 回答