1

我正在使用 a并通过隐式创建的对象向其QGraphicsScene添加常规小部件(QLineEdit,QComboBox等) :QGraphicsProxyWidget

m_pLineEdit = new QLineEdit("", 0);
m_pProxy = m_pGraphicsScene->addWidget(m_pLineEdit);

我目前正在寻找一种稍后再次从场景中检索这些小部件进行处理的方法,但找不到。

我已经尝试了以下方法:

  1. 由于我无法将图形场景作为父级传递给小部件构造函数,因此通过检索小部件m_pGraphicsScene->findChildren(QLineEdit*)不起作用,因为没有直接关系。
  2. 图形场景确实有一个QGraphicsSceneBspTreeIndex孩子,但这不是官方 Qt API 的一部分,因此依赖它不可能是要走的路。

底线:如何QGraphicsProxyWidget从 Qt 图形场景中获取所有对象?这可以在 Qt 标准中完成,还是我必须继承 QGraphicsScene 并尝试自己管理小部件?

4

2 回答 2

1

底线:如何从 Qt 图形场景中获取所有 QGraphicsProxyWidget 对象?

通过 获取场景中所有项目的列表scene->items(),然后检查它们是否属于正确的类:

// Horrible C++98 code which doesn't even feature algorithms

QList<QGraphicsItem *> items = scene->items();
foreach (QGraphicsItem *item, items) {
    QGraphicsProxyWidget *w;
    if (w = qgraphicsitem_cast<QGraphicsProxyWidget *>(item)) {
        use(w);
    }
}

但是,我想强调的是,您应该真正跟踪放置在场景中的物品。(至少,您以后有兴趣使用的那些)。走过现场并检索这样的项目似乎非常脆弱,这是代码质量差和设计差的信号。请注意,您有addWidget调用返回的代理,只需将其保存在某处即可。

于 2015-09-26T20:48:05.013 回答
1

在发布问题后,我偶然在 Qt 源代码中找到了解决方案。小部件代理在内部被视为常规 QGraphicsItem 并且可以通过以下方式进行转换qgraphicsitem_cast

QList<QGraphicsItem*> graphicsItemList = m_pGraphicsScene->items();
foreach(QGraphicsItem* pGraphicsItems, graphicsItemList)
{
    QGraphicsProxyWidget* pProxy = qgraphicsitem_cast<QGraphicsProxyWidget*>(pGraphicsItems);
    if(pProxy)
    {
        QLineEdit* pLineEdit = qobject_cast<QLineEdit*>(pProxy->widget());
        if(pLineEdit)
            // do stuff
    }
}   

如果有人知道更简单/更快的方法,我很乐意听到。在此之前,我将使用上述方法。

于 2015-09-26T20:48:44.530 回答