如何使用指向每个元素的指针向量删除qcheckbox数组?

How would I delete an array of QCheckBoxes using a vector of pointers to each element?

本文关键字:向量 指针 删除 qcheckbox 数组 元素 何使用      更新时间:2023-10-16

在我当前的项目中,我有一个qcheckbox数组,它是我在运行时根据用户提供的尺寸创建的。每次用户单击"Generate"按钮时,将收集他们输入的维度,并创建一个qcheckbox数组。它在以下代码中完成:

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?由于数组的前一个维度是局部变量,一旦函数返回就会丢失,当它被重新调用时,我怎么知道要删除多少元素?

如果用户按下"生成"按钮两次,将会有重叠的QCheckBoxes,所以我需要在每次调用函数时擦除它们。(而且,没有人想要内存泄漏!)

首先删除vector中的所有元素(QCheckBoxes),然后清除vector:

qDeleteAll(checkBoxVector);
checkBoxVector.clear();

因为你是在给vector添加复选框指针,所以仅仅清除vector并不会删除复选框。

您可以使用成员函数clear()来清除向量,即

checkBoxVector.clear();

这将删除所有内容,以便您可以再次填充。维数不重要,因为元素存储在"1d"中,QVector知道有多少个元素。

编辑:我应该更仔细地阅读,这将删除指针。你想要的是遍历每个指针,删除它指向的对象,即
vector<QCheckBoxes*>::iterator itr = checkBoxVector.begin();
while(itr != checkBoxVector.end())
{
    delete *(*(itr));
    ++itr;
}

只要使用QVector < QSharedPointer<QCheckBox> >,所有内容都会自动删除。

添加将看起来像这样:

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

您想要删除每个QCheckBox?

foreach (QCheckBox *checkBox, checkBoxVector)
    delete checkBox;
//QVector::clear() // clear does not release objects