Я использую QGraphicsScene
и я добавляю обычные виджеты (QLineEdit
, QComboBox
и т. д.) к нему через неявно созданный QGraphicsProxyWidget
объекты:
m_pLineEdit = new QLineEdit("", 0);
m_pProxy = m_pGraphicsScene->addWidget(m_pLineEdit);
В настоящее время я ищу способ позже извлечь эти виджеты со сцены для обработки, но не могу найти.
Я уже попробовал следующие подходы:
m_pGraphicsScene->findChildren(QLineEdit*)
не работает, так как нет прямой связи.QGraphicsSceneBspTreeIndex
ребенок, но это не является частью официального API Qt, и поэтому полагаться на него нельзя.Итог: как я могу получить все QGraphicsProxyWidget
объекты из графической сцены Qt? Можно ли это сделать в стандарте Qt или мне нужно создать подкласс QGraphicsScene и попробовать самостоятельно управлять виджетами?
Итог: Как я могу получить все объекты QGraphicsProxyWidget из графической сцены Qt?
Получить список всех предметов в сцене через 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
позвони, просто сохрани где-нибудь.
Сразу после публикации вопроса я случайно нашел решение в исходном коде 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
}
}
Если кто-то знает более простой / быстрый метод, я был бы рад услышать об этом. До тех пор я буду использовать подход, изложенный выше.