我使用Graphics View Framework创建一个图形场景。 我有一对(7 - 10)椭圆(垂直放置)创建:
ellipse = scene->addEllipse(x1, y1, w, h, pen, brush);
现在我想为动画准备图形。首先,所有椭圆都是黑色的。 5秒后,第一个应该是红色,第一个=绿色后5秒,第二个=红色,依此类推。
我的想法是获得第一个项目并为椭圆着色。但是我如何获得椭圆项?有没有这样的功能?
答案 0 :(得分:4)
您可以使用items()
方法从所有元素中获取排序列表。
然后迭代列表并检查它是否是椭圆项。
对于更多特殊情况,项目也会超载,看看其中一个是否符合您的需求。
方法:
QList<QGraphicsItem *> QGraphicsScene::items() const
您可以在此处找到文档:http://doc.qt.io/qt-4.8/qgraphicsscene.html#items
如果您有性能问题,请参阅Qt文档摘录,我100%同意:
QGraphicsScene最大的优势之一是它的能力 有效地确定物品的位置。即使有数百万 在场景中的项目,items()函数可以确定位置 在几毫秒内的项目。有几个重载 items():在某个位置找到项目的项目,找到的项目 内部或与多边形或矩形相交的项目等。 返回项目列表按堆叠顺序排序,使用 最上面的项目是列表中的第一项。为方便起见,那里 也是一个itemAt()函数,它返回给定的最顶层项 位置。
要检查您可以使用的项目类型:
int QGraphicsItem::type() const
摘自docs:
以int形式返回项的类型。所有标准图形项目 类与唯一值相关联;见QGraphicsItem :: Type。 qgraphicsitem_cast()使用此类型信息进行区分 类型之间。
第二种方法是直接使用qgraphicsitem_cast()
。
以下是使用自定义GraphicsItem Node
的{{3}}:
// 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;
}
}
答案 1 :(得分:3)
您可以存储从调用scene-&gt; addEllipse返回的指针并使用它们。
或者,尽管可能效率不高,但您可以遍历场景中的所有项目并使用dynamic_cast来检查类型。
我选择第一种方法。