【发布时间】:2011-03-02 00:41:10
【问题描述】:
由于 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 评估吗?
【问题讨论】:
-
+1 因为我有同样的问题。值得注意的一点是,您可以使用 setData()/data() 方法针对每个 QGraphicsItem 存储任意数据(QVariant),通过键访问数据。这可能很有用。
标签: c++ qt4 qgraphicsview qgraphicsitem