Нужно ли вызывать delete для QTreeWidgetItem или .clear() делает это?

Рейтинг: 2Ответов: 1Опубликовано: 12.11.2014
void MainWindow::ReadDir(const QString &path, QTreeWidgetItem *itm, int level)
{
    QDir mDir(path);
    QString format;

    for(int i = 0; i<level; i++ )
        format += "    ";

    mDir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files);
    for(QFileInfo temp : mDir.entryInfoList())
    {
        QTreeWidgetItem *child = new QTreeWidgetItem(2);
        child->setText(0, temp.fileName());
        child->setText(1, temp.absoluteFilePath());
        itm->addChild(child);
        if(temp.isDir())
            ReadDir(temp.absoluteFilePath(), child, level+1);
    }
}

void MainWindow::on_pushButton_clicked()
{
    ui->treeWidget->clear();
    QTreeWidgetItem * itm = new QTreeWidgetItem(2);
    itm->setText(0, "Root");
    ReadDir("D:\\", itm, 0);
    ui->treeWidget->addTopLevelItem(itm);
}

Выделенная память освобождается, если смотреть в диспетчере задач. Все ли корректно? Получается, clear() удаляет родителя и всех его потомков?

Ответы

▲ 2

Да, метод QTreeWidget::clear() корректно удалит все элементы выполнив для каждого освобождение памяти посредством delete. Однако если планируете удалять элементы самостоятельно и по одному, то необходимо сначала изъять их из виджета:

QTreeWidget *item = my_tree_wdg->takeTopLevelItem(index_of_item);
if(item) {delete item; item = NULL;}

Ну или просто:

delete my_tree_wdg->takeTopLevelItem(index_of_item);

... если уверены, что указанный индекс искомого элемента корректен.