2017-10-26 22 views
0

スロット内のツリー要素の削除を処理します。最後の(ルート)を除いて、すべての要素が削除されます。QTreeViewからルート要素を削除するには?

void TreeModel::slotDelete() 
{ 
QStandardItem *curItem = itemFromIndex(_tvMainTree->currentIndex()); 
QStandardItem *curParent = itemFromIndex(_tvMainTree->currentIndex())->parent(); 

if(!curItem || !curParent) return; 

curParent->removeRow(curItem->row()); 
} 

なぜそれが私が最後の要素を削除しようとすると、curParent0x0であるということですか?

仕様:私はinvisibleRootItem()のルート要素を使用してツリーを構築します。

最後の(ルート)要素を削除する方法を教えてください。

+1

完全なコードを表示 – eyllanesc

+1

さらに詳しい情報は、[mcve]をご覧ください。 – Murphy

答えて

0

定義により、ルート項目は階層の最上位です。親を持つことはできません。あなたがしようとしているものは無効です。

QStandardItemModelのようです。 QStandardItemModel::invisibleRootItem()のドキュメントの比較:

目に見えないルートアイテムはモデルの最上位レベルの項目へのアクセスを提供します[...]この関数から取得したQStandardItemオブジェクトのインデックスを()を呼び出すと、有効ではありません。

つまり、ルート項目/インデックスは暗黙的に作成されます。それを削除することはできず、この時点で再帰を停止する必要があります。これは、Qtモデルを使用するときの一般的なパターンです:parent()nullptrを返した場合は、ルートインデックスに達しています。

+0

はい、QStandardItemModelを使用しています。私は根の目に見えない要素を削除したくありません。私は目に見えるアイテムを削除したい。 – Compozitor

+0

@Compozitor私は自分の答えを更新しました。そうでなければ、あなたの*本当の*問題が何であるかを示すあなたの質問を明確にするようアドバイスします。 – Murphy

+0

ありがとうございました! – Compozitor

0

ありがとうございます。ここに解決策があります。

void TreeModel::slotDelete() 
{ 
QStandardItem *curItem = itemFromIndex(_tvMainTree->currentIndex()); 
if(!curItem) return; 

QStandardItem *curParent = curItem->parent(); 
if(!curParent) 
{ 
    invisibleRootItem()->removeRow(curItem->row()); 
    return; 
} 

curParent->removeRow(curItem->row()); 
} 
関連する問題