1

ボタンが押されたときに項目を 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 に動的メモリを割り当てました。2番目のケースでは、に渡してから削除しましたaddTopLevelItem()が、Qtが後で必要になるのではないかと心配しています。これについての適切な方法は何ですか?

4

1 に答える 1

1

QTreeWidget デストラクタが削除を処理するため、クラスはアイテムのライフサイクルを処理します。外部削除をドロップするだけです。IT は 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();
}
于 2014-05-25T07:55:53.557 に答える