6

QTreeView に QAbstractItemModel を実装しようとしています。行の挿入に問題があります。アプリケーションの最初に挿入すると、すべて正常に動作することに気付きました。しかし、後で行を挿入すると、他の操作 (選択など) の後、新しい項目は非表示のままになります。さらに、QTreeView はまったく機能しないようです。行の挿入について QTreeView に通知するためにいくつかの信号を送信する必要がありますか?

これは私の挿入方法です:

bool LayersModel::insertRows(int position, int count, const QModelIndex  & parent)
{
    LayersModelItem * parentItem = getItem(parent);
    if (position > parentItem->childCount())
        return false;
    beginInsertRows(parent,position,position+count-1);
    bool result = true;
    for (;count;--count)
        result &= parentItem->insertChildren(position, new LayersModelItem());
    endInsertRows();
    return result;
}

LayersModelItem は、子とデータを持つ QList を持つクラスです。

私のプロジェクトの完全なコード (KDE ライブラリが必要) はこちらです: https://github.com/coder89/PhotoFramesEditor/tree/v0.0.8 問題を確認するには、メイン ウィンドウの青い項目の 1 つを選択し、それを右クリックして、 「アイテムを削除」を選択します。(このメソッドは Canvas::removeItems() にあります) 完全にコメントされています - 私は絶望的で、この問題の理由を見つけようとしました... (実際には何も削除されませんでした - 新しいアイテムを追加します)。

ヘルプとアドバイスをありがとう!

4

1 に答える 1

11

ちょっとした推測ですが、QAbstractItemModel の QT Doc には次のように書かれています...

モデルは、変化を示す信号を発します。たとえば、 dataChanged() は、モデルによって使用可能になったデータ項目が変更されるたびに発行されます。モデルによって提供されるヘッダーを変更すると、 headerDataChanged() が発行されます。基になるデータの構造が変更された場合、モデルは * layoutChanged()を発行して、新しい構造を考慮して* 表示されているアイテムを再表示する必要があることをアタッチされたビューに示すことができます。

したがって、接続されたビューを更新するには、(モデル内のデータを変更するたびに) モデルから layoutChanged() シグナルを発行する必要があると思います。

モデル ビュー アーキテクチャの QT ドキュメント、QT での実装方法もお読みください。

それが役立つかどうかを確認してください。そうでない場合は、コードをダウンロードしてデバッグし、何が問題なのかを確認します。幸運を

于 2011-07-06T06:01:32.630 に答える