editabletreemodel の例とQTreeView & QAbstractItemModel & insertRowのアドバイスに従って QTreeView & QAbstractItemModel を実装しました。
それはうまくいきます。しかし、私には理解できない違いがあります。
子行を挿入するときにアプリケーションを適切に動作させるには、layoutChanged() を発行する必要がありました。そうしなければならなかった。私が発行しない場合 - 子の挿入はうまくいきません: 新しい子がモデルに正しく表示され、(保存すると) 正しく保存されますが、ビューには表示されません。
editabletreemodel の例には「emit layoutChanged()」が含まれておらず、子を挿入しても問題なく動作します。
QAbstractItemModel 兄弟クラスの insertRows メソッドは次のとおりです。
bool ExTree::insertRows(int position, int rows, const QModelIndex &parent)
{
ExObject *parentItem = getItem(parent);
bool success;
beginInsertRows(parent, position, position + rows - 1);
success = parentItem->insertChildren(position, rows, rootItem->columnCount());
endInsertRows();
if(success) emit layoutChanged();
return success;
}
editabletreeview の例とほとんど同じですが、唯一の違いはエミットです。
なぜですか?
editabletreeviewはこれを行わないのに、正確にlayoutChanged()を発行する必要がある理由を理解したいです。誰かがこの点を説明していただければ幸いです。
なぜ発するのか理解する必要はありません。なぜ発行する必要があるのか 、editabletreeviewがそれを必要としないのかを理解する必要があります。