我正在使用QGraphicsScene
,我正在通过隐式创建的QLineEdit
对象添加常规小部件(QComboBox
,QGraphicsProxyWidget
等):
m_pLineEdit = new QLineEdit("", 0);
m_pProxy = m_pGraphicsScene->addWidget(m_pLineEdit);
我目前正在寻找一种方法,以便稍后从场景中检索这些小部件进行处理,但无法找到。
我已经尝试了以下方法:
m_pGraphicsScene->findChildren(QLineEdit*)
检索窗口小部件不起作用,因为没有直接的关系。QGraphicsSceneBspTreeIndex
子项,但这不是官方Qt API的一部分,因此依赖它不可能是最佳选择。底线:如何从Qt图形场景中获取所有QGraphicsProxyWidget
个对象?这可以在Qt标准中完成,还是我必须继承QGraphicsScene并尝试自己管理小部件?
答案 0 :(得分:0)
底线:如何从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
调用返回了代理,只需将其保存在某处。
答案 1 :(得分:0)
在发布问题后,我偶然在Qt源代码中找到了解决方案。小部件代理在内部被视为常规QGraphicsItem,可以通过var str = " Hello World! ";
alert(str.trim());
进行转换:
qgraphicsitem_cast
如果有人知道更简单/更快的方法,我很乐意听到它。在那之前,我将使用上面概述的方法。