我用图形视图框架创建了一个图形场景。我有一对(7-10)椭圆(垂直放置),创建时:
ellipse = scene->addEllipse(x1, y1, w, h, pen, brush);现在我要准备动画的图形。首先,所有椭圆都是黑色的。5秒后,第一个应该是红色,5秒后第一个=绿色,第二个=红色等等。
我的想法是得到第一个项目和颜色的椭圆。但是我怎样才能得到椭圆的东西呢?有这样的功能吗?
发布于 2015-05-12 13:24:52
可以使用items()方法从所有元素中获取排序列表。然后迭代列表并检查它是否是椭圆项。
对于更多的特殊情况,项目也是过度的,看看其中一个是否适合您的需要。
方法:
QList<QGraphicsItem *> QGraphicsScene::items() const您可以在这里找到文档:http://doc.qt.io/qt-4.8/qgraphicsscene.html#items
如果您有性能方面的问题,下面是Qt的摘录,我完全同意:
QGraphicsScene最大的优点之一是它能够有效地确定项目的位置。即使在现场有数百万项,items()函数也可以在几毫秒内确定项目的位置。items ()有几个重载:一个在特定位置查找项目,一个在多边形或矩形内查找或交叉项,等等。返回项的列表按堆叠顺序排序,最上面的项是列表中的第一项。为了方便起见,还有一个itemAt()函数,它在给定的位置返回最上面的项。
要检查可以使用的项的类型,请执行以下操作:
int QGraphicsItem::type() const摘录自文档
将项的类型作为int返回。所有标准的graphicsitem类都与唯一值相关联;请参见QGraphicsItem::Type。qgraphicsitem_cast()使用此类型信息来区分类型。
第二种方法是直接使用qgraphicsitem_cast()。
下面是一个示例,它使用自定义GraphicsItem Node
// Sum up all forces pushing this item away
qreal xvel = 0;
qreal yvel = 0;
foreach (QGraphicsItem *item, scene()->items()) {
Node *node = qgraphicsitem_cast<Node *>(item);
if (!node)
continue;
QPointF vec = mapToItem(node, 0, 0);
qreal dx = vec.x();
qreal dy = vec.y();
double l = 2.0 * (dx * dx + dy * dy);
if (l > 0) {
xvel += (dx * 150.0) / l;
yvel += (dy * 150.0) / l;
}
}发布于 2015-05-12 12:59:45
您可以存储从调用场景->addEllipse返回的指针,并使用这些指针。
或者,虽然可能效率不高,但您可以遍历场景中的所有项目,并使用dynamic_cast检查类型。
我会选择第一种方法。
https://stackoverflow.com/questions/30191586
复制相似问题