Pergunta

Como a maioria das funções de conveniência do QGraphicsScene e QGraphicsItem (como itens (), colidiriTems (), Childitems () etc.) retorna um qlist, você é forçado a fazer muitas verificações qgraphicsitem_cast ou static_cast e qgraphicsItem ::) Segure os itens reais quando tiver muitos tipos diferentes de itens na cena. Eu pensei que fazer muitos elencos de subclasse não eram um estilo de codificação desejável, mas acho que, neste caso, não há outra maneira viável, ou existe?

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
}

O QGraphicsItem_cast acima pode ser substituído pelo static_cast, pois o tipo correto já está verificado. Ao fazer muitos deles o tempo todo (cena muito dinâmica), o numeroso elenco afetará o desempenho além da avaliação normal do IF-ELSE?

Foi útil?

Solução

A sobrecarga de desempenho é principalmente pré -paga; É o resultado da sobrecarga de ter o.type() membro. Pode ser eficiente recuperar o item->type() uma vez. Você sabe que isso não muda, mas é provável que o compilador não.

Editar] Além disso, se você verdade Tenha muitos tipos, pode valer a pena introduzir alguns tipos intermediários. por exemplo. if (dynamic_cast<MyGraphicsInterMediateType*>(item)) {/* check those types */} else {/* other types */}

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top