首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT图形视图在场景中查找项目

QT图形视图在场景中查找项目
EN

Stack Overflow用户
提问于 2015-05-12 12:57:13
回答 2查看 9.2K关注 0票数 1

我用图形视图框架创建了一个图形场景。我有一对(7-10)椭圆(垂直放置),创建时:

代码语言:javascript
复制
ellipse = scene->addEllipse(x1, y1, w, h, pen, brush);

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

我的想法是得到第一个项目和颜色的椭圆。但是我怎样才能得到椭圆的东西呢?有这样的功能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-12 13:24:52

可以使用items()方法从所有元素中获取排序列表。然后迭代列表并检查它是否是椭圆项。

对于更多的特殊情况,项目也是过度的,看看其中一个是否适合您的需要。

方法:

代码语言:javascript
复制
QList<QGraphicsItem *> QGraphicsScene::items() const

您可以在这里找到文档:http://doc.qt.io/qt-4.8/qgraphicsscene.html#items

如果您有性能方面的问题,下面是Qt的摘录,我完全同意:

QGraphicsScene最大的优点之一是它能够有效地确定项目的位置。即使在现场有数百万项,items()函数也可以在几毫秒内确定项目的位置。items ()有几个重载:一个在特定位置查找项目,一个在多边形或矩形内查找或交叉项,等等。返回项的列表按堆叠顺序排序,最上面的项是列表中的第一项。为了方便起见,还有一个itemAt()函数,它在给定的位置返回最上面的项。

要检查可以使用的项的类型,请执行以下操作:

代码语言:javascript
复制
int QGraphicsItem::type() const

摘录自文档

将项的类型作为int返回。所有标准的graphicsitem类都与唯一值相关联;请参见QGraphicsItem::Type。qgraphicsitem_cast()使用此类型信息来区分类型。

第二种方法是直接使用qgraphicsitem_cast()

下面是一个示例,它使用自定义GraphicsItem Node

代码语言:javascript
复制
// 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;
    }
}
票数 4
EN

Stack Overflow用户

发布于 2015-05-12 12:59:45

您可以存储从调用场景->addEllipse返回的指针,并使用这些指针。

或者,虽然可能效率不高,但您可以遍历场景中的所有项目,并使用dynamic_cast检查类型。

我会选择第一种方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30191586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档