2011-07-09 80 views
1

在我當前的項目中,我有一組QCheckBoxes,它們是在運行時根據用戶的尺寸創建的。每次用戶點擊「生成」按鈕時,都會收集它們輸入的尺寸,並創建一個QCheckBoxes數組。它在下面的代碼完成:如何使用指向每個元素的指針向量來刪除QCheckBoxes的數組?

void MainWindow::on_generateBoxes_clicked() 
{ 
    int x_dim = ui->xDim->value(); 
    int y_dim = ui->yDim->value(); 
    int z_dim = ui->zDim->value(); 

    for(int i = 0; i < x_dim; ++i){ 
     for(int j = 0; j < y_dim; ++j){ 
      checkBoxVector.append(new QCheckBox(ui->dim1)); 
      checkBoxVector.last()->setGeometry(i * 20, j * 20, 20, 20); 
     } 
    } 
} 

checkBoxVector是在另一個源文件中聲明指針的全局數組:

QVector<QCheckBox*> checkBoxVector; 

我的問題是,我將如何去通過checkBoxVector除去每QCheckBox?由於數組的前一維是局部變量,一旦函數返回就會丟失,當它被重新調用時,我將如何知道要刪除多少個元素?

如果用戶按兩次'Generate'按鈕,會出現重疊的QCheckBoxes,所以每次調用函數時都需要擦除它們。 (同樣,沒有人願意內存泄漏!)

回答

5

首先刪除向量的所有元素(QCheckBoxes),然後清除載體:

qDeleteAll(checkBoxVector); 
checkBoxVector.clear(); 

因爲要添加複選框指針向量,就清除載體不刪除複選框。

+0

謝謝,這個作品完美! –

1

您可以清除使用成員函數clear()載體,即

checkBoxVector.clear(); 

這將刪除一切,所以你可以再次填充它。尺寸並不重要,因爲元素存儲在「1d」中,QVector知道有多少元素。

編輯:我應該仔細閱讀,這將刪除指針。你需要的是遍歷每個指針刪除它指向的對象,即

vector<QCheckBoxes*>::iterator itr = checkBoxVector.begin(); 
while(itr != checkBoxVector.end()) 
{ 
    delete *(*(itr)); 
    ++itr; 
} 
+0

注意'itr'解除引用兩次,第一次去的指針,第二次去了'QCheckBox'對象。 – Dan

+0

這給了我很多錯誤: 錯誤:從'QCheckBox **'轉換爲非標量類型'std :: vector > ::迭代器'請求 和 錯誤:無在'itr!= checkBoxVector.QVector :: end [with T = QCheckBox *,T * = QCheckBox **]()'' 和 錯誤:type'class QCheckBox'argument to'刪除',預期的指針 –

+0

對不起,我當時是一個木偶。你只需要解引用一個(我認爲,再次未經測試),因爲delete需要一個指向該對象的指針,然後它調用對象析構函數。 另一個錯誤可能是因爲我寫的矢量不是QVector,我也假設符號類似於std :: vector,它可能略有不同。 – Dan

0

你想刪除所有QCheckBox?

foreach (QCheckBox *checkBox, checkBoxVector) 
    delete checkBox; 

//QVector::clear() // clear does not release objects 
+0

如果我調用該函數2次或3次,此解決方案會導致程序意外關閉。我不知道爲什麼 –

+0

無論如何,這個版本中的所有QVector中的QCheckBox()和checkBoxVector.clear()用於從矢量中移除元素並釋放矢量使用的內存。 –

0

只需使用QVector < QSharedPointer<QCheckBox> >所有內容都會自動刪除。

添加會是這個樣子:

CheckBoxes.append(QSharedPointer<QCheckBox>(new QCheckBox()));