2015-11-13 42 views
0

這是一個相當有據可查的問題,但經過一些閱讀和嘗試,我仍然努力從QVBoxLayout中刪除自定義控件。無法從QVBoxLayout中刪除自定義QWidget

MyClass.h文件

,我宣佈一個矢量持有QPointer對象:

vector< QPointer<MyWidget> > myWidgets; 

MyClass.cpp文件,我創建的窗口小部件,並將其與添加到佈局:

// create object 
void MyClass::createMyWidget() { 
    QPointer<MyWidget> myWidget(new MyWidget()); 
    myWidgets.push_back(myWidget); 
} 

//display in layout 
void MyClass::displayWidgets() { 
    for(int i = 0; i < myWidgets.size(); i++) { 
     myWidgets[i]->setId(i); 
     ui->myVBoxLayout->addWidget(myWidgets[i].data()); 
    } 
} 

我已經嘗試了以下操作以從佈局中刪除小部件:

void MyClass::removeMyWidget(int id) { // id of the custom widget. id is also position in the layout 
    for(int i = 0; i < myWidgets.size(); i++) { 
     if(items[i]->getId() == id) { //correctly targets the widget 
      // method 1 
      ui->myVBoxLayout->removeItem(ui->myVBoxLayout->takeAt(i)); 

      //method 2 
      //ui->myVBoxLayout->removeWidget(items[i]); 
     } 
    } 
} 

上述兩項工作都無法解決原因。

回答

2

在Qt中,佈局只是一個用於確定窗口小部件(以及其他項目,如嵌套佈局或間隔符)大小和位置的管理器。

當您從佈局中移除一個項目時,它仍然是由佈局佈局的父控件的子控件,只是它的幾何圖形不再被管理。儘管如此,該小部件仍然存在並顯示出來,用戶可以與其進行交互。

您還必須將其刪除或隱藏。嘗試

void MyClass::removeMyWidget(int id){ // id of the custom widget. id is also position in the layout 
    for(int i=0;i<myWidgets.size();i++){ 
     if(items[i]->getId() == id){ //correctly targets the widget 
      ui->myVBoxLayout->removeWidget(myWidgets[i]); 
      delete myWidgets[i]; // <= Delete widget 
     } 
    } 
}