2015-09-26 66 views
1

我正在使用QGraphicsScene的,我通過隱含定期添加小部件(QLineEditQComboBox等),它創造QGraphicsProxyWidget對象:如何獲取QGraphicsScene的組件(QGraphicsProxyWidget)?

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

我目前正在尋找一種方式來以後檢索這些小部件從現場再次進行處理,但無法找到一個。

我嘗試以下方法已經:

  1. 既然不能通過圖形場景作爲父母的窗口部件的構造,通過m_pGraphicsScene->findChildren(QLineEdit*)檢索小部件不工作,因爲沒有直接的關係。
  2. 圖形場景確實有一個QGraphicsSceneBspTreeIndex孩子,但這不是官方Qt API的一部分,因此依靠它不能成爲一種方式。

底線:如何從Qt圖形場景獲取所有QGraphicsProxyWidget對象?這可以在Qt標準中完成,還是必須繼承QGraphicsScene並嘗試自己管理小部件?

回答

0

就在發佈問題後,我偶然在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 
    } 
} 

如果有人知道更簡單/更快的方法,我很高興聽到這個消息。在此之前,我將使用上述方法。

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調用返回的代理,請將其保存在某個地方。