Как бы я удалил массив QCheckBoxes, используя вектор указателей на каждый элемент? - PullRequest
1 голос
/ 09 июля 2011

В моем текущем проекте у меня есть массив 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? Поскольку предыдущие измерения массива - это локальные переменные, которые теряются при возврате функции, когда она вызывается повторно, как узнать, сколько элементов нужно удалить?

Если бы пользователь дважды нажал кнопку «Создать», QCheckBoxes пересекались бы друг с другом, поэтому мне нужно стирать их каждый раз при вызове функции. (Также никто не хочет утечки памяти!)

Ответы [ 4 ]

5 голосов
/ 10 июля 2011

Сначала удалите все элементы (QCheckBoxes) в векторе, а затем очистите вектор:

qDeleteAll(checkBoxVector);
checkBoxVector.clear();

Поскольку вы добавляете указатели флажков на вектор, просто очистка вектора не удаляет флажки.

1 голос
/ 09 июля 2011

Вы можете очистить вектор, используя функцию-член clear(), то есть

checkBoxVector.clear();

Это удалит все, чтобы вы могли заполнить его снова.Размеры не имеют значения, потому что элементы хранятся в «1d», и QVector знает, сколько их.

Редактировать: я должен прочитать более внимательно, это удалит указатели.Вам нужно перебирать каждый указатель, удаляя объект, на который он указывает, т.е.

vector<QCheckBoxes*>::iterator itr = checkBoxVector.begin();
while(itr != checkBoxVector.end())
{
    delete *(*(itr));
    ++itr;
}
0 голосов
/ 01 августа 2011

Просто используйте QVector < QSharedPointer<QCheckBox> > Все будет удалено автоматически.

Добавление будет выглядеть примерно так:

CheckBoxes.append(QSharedPointer<QCheckBox>(new QCheckBox()));
0 голосов
/ 09 июля 2011

Вы хотите удалить все QCheckBox?

foreach (QCheckBox *checkBox, checkBoxVector)
    delete checkBox;

//QVector::clear() // clear does not release objects
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...