3

ノードを挿入するには、次のものがあります。

  layoutAboutToBeChanged();
  beginInsertRows(createIndex(p_parent->row(), 0, p_parent), start, end);
  TreeNode* p_node = new TreeNode(p_parent, p_data);
  p_parent->appendChild(start, p_node);
  endInsertRows();
  layoutChanged();

行を削除するには:

  layoutAboutToBeChanged();
  beginRemoveRows(createIndex(p_parent->row(), 0, p_parent), row, row);
  p_parent->removeChildren(row, row+1, this);
  endRemoveRows();
  layoutChanged();

removeChildren呼び出されると、削除されるノードごとに次の処理が行われます。

 changePersistentIndex(createIndex(p_node->row(), 0, p_node), QModelIndex());
 delete p_node;

できます。ノードを追加したり、ノードを削除したりできます。

用語 注: 私は と を同じ意味で使用nodesしてrowsいます。混乱して申し訳ありません。

機能しないもの:

  1. 選択したノードの前に新しい行が挿入された場合。新しく挿入されたノードが選択されます。[これは私が望むものではありません。]
  2. 行が選択され、後で削除された場合、即時のコア ダンプ。
  3. 削除された行にマウス カーソルを合わせると、すぐにコア ダンプが実行されます。

削除しないとp_node。すべてが正常に動作します。しかし、明らかにそれはメモリリークを引き起こします。私は何を間違っていますか?

参考までに、64 ビット Linux で QT 5.0.2 を使用しています。

4

3 に答える 3

1

To fix crashes you should use deleteLater instead of delete, so your view won't die trying to access invalid objects.

Selected item seems a index problem. Looks like it's missing a notification to view.

于 2013-07-10T09:00:14.310 に答える
1

子メソッドを追加および削除すると、rowCount が更新されますか?

それが問題のようです。

QStandardItemModelでどのように行われているかを確認してください

行数を更新すると、永続的なインデックスを更新しなくても、次の 3 つの点が解決されます。

  1. 行数が更新されていない場合、選択したアイテムが以前に挿入されたインデックスが指している場所に変更されるのは正常です。
  2. & 3. インデックスが削除されたアイテムを指しています。
于 2013-07-10T10:13:23.933 に答える
0

ポイント1へ:たぶん

model->blockSignals(true);
...
model->blockSignals(false); 

その選択動作を修正します。

選択したインデックス/行には、フレームワークから呼び出される関数がいくつかあると思います。したがって、それらが削除されると、クラッシュが発生します。それらを削除したい場合は、選択を別の行/インデックスに設定すると、正常に動作するはずです... '

削除された行の上にマウスを置いた場合...行を空にする必要がある場合は、テキストを空に設定してみませんか?

于 2013-07-10T05:49:09.403 に答える