我想在按下按钮时将项目添加到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可能会在以后需要它。什么是正确的方法?
答案 0 :(得分:1)
QTreeWidget析构函数将负责删除,因此类将处理项目的生命周期。只需删除外部删除即可。 IT会导致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();
}