如何获取QGraphicsScene的小部件(QGraphicsProxyWidget)?
How to get widgets (QGraphicsProxyWidget) of QGraphicsScene?
我正在使用 QGraphicsScene
并通过隐式创建的 QGraphicsProxyWidget
对象向其添加常规小部件(QLineEdit
、QComboBox
等):
m_pLineEdit = new QLineEdit("", 0);
m_pProxy = m_pGraphicsScene->addWidget(m_pLineEdit);
我目前正在寻找一种方法,以便稍后再次从场景中检索这些小部件以进行处理,但找不到。
我已经尝试过以下方法:
- 由于我无法将图形场景作为父级传递给小部件构造函数,因此通过
m_pGraphicsScene->findChildren(QLineEdit*)
检索小部件不起作用,因为没有直接关系。
- 图形场景确实有一个
QGraphicsSceneBspTreeIndex
子场景,但这不是官方 Qt 的一部分 API,因此不能依赖它。
底线:如何从 Qt 图形场景中获取所有 QGraphicsProxyWidget
对象?这可以在 Qt 标准中完成,还是我必须继承 QGraphicsScene 并尝试自己管理小部件?
Bottom-line: How can I get all the QGraphicsProxyWidget objects from a Qt graphics scene?
通过 scene->items()
获取场景中所有物品的列表,然后检查它们是否正确 class:
// 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
调用返回的代理,只需将其保存在某个地方即可。
刚发完问题偶然在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
}
}
如果有人知道 simpler/faster 方法,我会很高兴听到。在那之前,我将使用上面概述的方法。
我正在使用 QGraphicsScene
并通过隐式创建的 QGraphicsProxyWidget
对象向其添加常规小部件(QLineEdit
、QComboBox
等):
m_pLineEdit = new QLineEdit("", 0);
m_pProxy = m_pGraphicsScene->addWidget(m_pLineEdit);
我目前正在寻找一种方法,以便稍后再次从场景中检索这些小部件以进行处理,但找不到。
我已经尝试过以下方法:
- 由于我无法将图形场景作为父级传递给小部件构造函数,因此通过
m_pGraphicsScene->findChildren(QLineEdit*)
检索小部件不起作用,因为没有直接关系。 - 图形场景确实有一个
QGraphicsSceneBspTreeIndex
子场景,但这不是官方 Qt 的一部分 API,因此不能依赖它。
底线:如何从 Qt 图形场景中获取所有 QGraphicsProxyWidget
对象?这可以在 Qt 标准中完成,还是我必须继承 QGraphicsScene 并尝试自己管理小部件?
Bottom-line: How can I get all the QGraphicsProxyWidget objects from a Qt graphics scene?
通过 scene->items()
获取场景中所有物品的列表,然后检查它们是否正确 class:
// 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
调用返回的代理,只需将其保存在某个地方即可。
刚发完问题偶然在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
}
}
如果有人知道 simpler/faster 方法,我会很高兴听到。在那之前,我将使用上面概述的方法。