QGraphicsViewフレームワークとパフォーマンスのポインタキャストの多く

StackOverflow https://stackoverflow.com/questions/3012169

質問

QGraphicsSceneとQGraphicsItemの便利な機能のほとんどは()などの項目として(、collidingItems()、childItems()など)あなたがqgraphicsitem_castかはstatic_castとQGraphicsItemの多くを行うことを余儀なくしているQListにを返す::タイプ(あなたがシーン内の項目の異なる種類の多くを持っている場合)のチェックは、実際のアイテムを手に入れます。私は、サブクラスキャストのやってたくさんのが望ましくコーディングスタイルではないと思っていたが、私はこのケースでは、他の実行可能な方法が存在しないと思う、またはそこには?

であります
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を置き換えることができます。これらの多くのすべての時間(非常にダイナミックなシーン)を行う場合、数多くの鋳造は、通常であれば、他の評価を超えてパフォーマンスに影響を与えるのだろうか?

役に立ちましたか?

解決

は、パフォーマンス・オーバーヘッドはほとんどプリペイドあります。それは.type()の部材を有するのオーバーヘッドの結果です。一度item->type()を取得するのが効率的かもしれません。あなたは、それは変わらないけど、チャンスは、コンパイラにはないです。

[編集] あなたが本当にの種類の多くを持っている場合にも、いくつかの中間的なタイプを導入する価値がある可能性があります。例えば。 if (dynamic_cast<MyGraphicsInterMediateType*>(item)) {/* check those types */} else {/* other types */}

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top