2012-05-23 81 views
1

我有一個QGridLayout我在那裏添加我的自定義QWidgets從QGridLayout刪除QWidgets

當我嘗試刪除它們時,它們應該從佈局中刪除(因爲函數layout.count()返回0),但它們仍顯示在界面中,我可以與它們交互。

這裏有我的小部件添加方式:

void MyClass::addCustomWidget(CustomWidget *_widget, int r, int c) 
{ 
    layout->addWidget(_widget, r, c); 
    _widget->show(); 
} 

而且來這裏的路上我刪除它們:

void MyClass::clearLayout() 
{ 
    qDebug() << "Layout count before clearing it: " << layout->count(); 

    int count = layout->count(); 
    int colums = layout->columnCount(); 
    int rows = layout->rowCount(); 

    int i=0; 
    for(int j=0; j<rows; j++) 
    { 
     for(int k=0; k<colums && i<count; k++) 
     { 
      i++; 

      qDebug() << "Removing item at: " << j << "," << k; 
      QLayoutItem* item = layout->itemAtPosition(j, k); 

      if (!item) continue; 

      if (item->widget()) { 
       layout->removeWidget(item->widget()); 
      } else { 
       layout->removeItem(item); 
      } 
      qDebug() << "Removed!"; 
     } 
    } 

    qDebug() << "Layout count after clearing it: " << layout->count(); 
} 

任何形式的幫助或提示從QGridLayout正確刪除項目/部件?

P.D. :我在互聯網上看到很多人直接從佈局中刪除它們(刪除_widget)後刪除它們。在我的情況下,這是不可能的,因爲我需要保存在內存中的小部件。

+1

可能重複(http://stackoverflow.com/questions/5395266/removed-widgets-from-qgridlayout) – emkey08

回答

1

只是要清楚。你沒有「刪除」這些小部件。你只從佈局中刪除它們。從佈局移除意味着只有這個小部件不會被這個佈局管理(調整大小/放置),但這並不意味着小部件將被「刪除」(用C++方式)。此外,小部件不會神奇隱藏。從佈局移除後,您的小部件仍留在它創建/管理的小部件中。因此,此佈局的所有者仍然將此小部件作爲子項(可見子項)。

你必須

  1. 隱藏窗口小部件,或者如果你確定它不會再使用

  2. 刪除小部件「刪除」關鍵字

你也不要不需要撥打removeWidget(item->widget()); removeItem(item)將足以爲所有版面項目(甚至是那些小窗口內)

+0

我的意圖是從佈局中移除小部件(並且不再顯示它們),但將它們保存在內存中。 我試圖隱藏窗口小部件(_widget.hide)之前,我從佈局中刪除它,它的工作,謝謝。 – AZorrozua

0

嘗試

QLayoutItem *child; 
while ((child = layout->takeAt(0)) != 0); 

這是supposed to be safe。如果由於任何原因無效,您可以使用一組窗口小部件或佈局項目,每次添加小部件時都會對其進行更新。然後刪除你循環集合並從佈局中刪除每個元素。

0
Header: 
class Grid : QGridLayout 
{ 
public: 
    Grid(QWidget* parent); 
    void addElement(QWidget* element, int x, int y); 
    void delElement(int x, int y); 
    void resize(int width, int height); 
    void clear(); 
protected: 
    QSize size; 
}; 

void Grid::clear(){ 
    for(int i = 0;i<size.width();i++){ 
     for(int j = 0;j<size.height();j++){ 
      QLayoutItem* item = takeAt(i*size.width() + j); 
      if(item != NULL) delete item; 
     } 
    } 
} 
0

您還可以使用deleteLater(),以避免與迭代過程中保持孩子 計數的問題:從QGridLayout卸下部件]的

for (int i = 0; i < gridLayout.count(); i++) 
{ 
    gridLayout.itemAt(i)->widget()->deleteLater(); 
} 
+0

感謝您在5年後嘗試解決此問題;) – AZorrozua