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 に答える