Я хочу добавить элементы в QTreeWidget при нажатии кнопки. Я использую следующий код в моей программе:
void MainWindow::on_training_addButton_clicked()
{
countertest++;
QStringList slist;
slist << QString::number(countertest);
ui->trainingDataTreeWidget->addTopLevelItem(new QTreeWidgetItem(slist)); //case 1
//QTreeWidgetItem* item = new QTreeWidgetItem(slist); //case 2
//ui->trainingDataTreeWidget->addTopLevelItem(item);
//delete item;
}
В обоих случаях я выделил динамическую память для QTreeWidgetItem. Во втором случае я удалил его после передачи addTopLevelItem()
, но я волнуюсь, что Qt может понадобиться позже. Как правильно это сделать?
Деструктор QTreeWidget позаботится об удалении и, следовательно, о классе жизненного цикла элементов. Просто отбросьте внешнее удаление. Это приведет к тому, что QTreeWidget попытается удалить висячий указатель, что будет хорошо известно как сбой двойного удаления.
Вот доказательство из документации, а также источника:
QTreeWidget :: ~ QTreeWidget ()
Уничтожает виджет дерева и все его элементы.
/*!
\internal
Destroys this tree model.
*/
QTreeModel::~QTreeModel()
{
clear();
delete headerItem;
rootItem->view = 0;
delete rootItem;
}
/*!
\internal
Removes all items in the model.
*/
void QTreeModel::clear()
{
SkipSorting skipSorting(this);
beginResetModel();
for (int i = 0; i < rootItem->childCount(); ++i) {
QTreeWidgetItem *item = rootItem->children.at(i);
item->par = 0;
item->view = 0;
delete item;
}
rootItem->children.clear();
sortPendingTimer.stop();
endResetModel();
}