QT图形查看场景中的查找项目

时间:2015-05-12 12:57:14

标签: c++ qt qgraphicsview

我使用Graphics View Framework创建一个图形场景。 我有一对(7 - 10)椭圆(垂直放置)创建:

ellipse = scene->addEllipse(x1, y1, w, h, pen, brush);

现在我想为动画准备图形。首先,所有椭圆都是黑色的。 5秒后,第一个应该是红色,第一个=绿色后5秒,第二个=红色,依此类推。

我的想法是获得第一个项目并为椭圆着色。但是我如何获得椭圆项?有没有这样的功能?

2 个答案:

答案 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来检查类型。

我选择第一种方法。