2017-05-05 2 views
0

QtはQML and suggests three approaches in the docsとC++のモデルを結合する可能性を提供しています:QMLのオブジェクトを含むQAbstractListModelの短所は何ですか?

  • QStringList
  • QObjectList
  • QAbstractItemModel

前の二つは使用が非常に簡単であり、例えばQObjectList

// in C++ 
QList<QObject*> dataList; 
dataList.append(new DataObject("Item 1", "red")); 

// in QML 
ListView { 
    model: dataList 
    delegate: Text { text: name } 
} 

しかし、彼らの両方が強力な警告が付属しています:

注:ビューは QListの内容が変更されたことを知るための方法はありません。 QListに変化した場合、

QAbstractItemModelは、オブジェクトのプロパティを直接同期でそれらを保つため、露出していないされているので、オブジェクトを使用することは困難であるのかなりを取る[...] モデルをリセットする必要があります努力。

QAbstractItemModelQListをラップしてスーパーシンプルなモデルを得ることができます。ここを参照してください:Implementation 1


Implementation 2はQtは、これをネイティブに実装していない理由はありますか?パフォーマンス?メモリ管理の問題?これは明らかに良い考えで、ObjectModelと同じようなものを実装しています。

答えて

2

QObjectの使い方の著しい欠点は、基本クラスがかなり大きいので、全体的なものがたくさん入っている「神オブジェクト」(アンチパターン)のようなものですあなたは本当にほとんどの時間を必要としません。結果として、モデルデータの上に約160バイトの「オーバーヘッド」があります。多くのアイテムを持つ大きなモデルがあり、アイテム自体が比較的小さい場合には問題がある可能性があります。あなたは多くのオーバーヘッドで終わります。

モデルとしてQObjectListは、まったく些細なことをしない限り、常に悪い考えです。参照のビューに変更を通知するための適切なインタフェースは実装されていないため、唯一の方法は更新を強制することです。変更だけでなくモデル全体を再描画します。

モデルを適切に実装している限り、アイテムオブジェクトは必須ではありません。

いくつかの理由のために特に有用で第2の実施:

    あなたは固定それぞれの役割と、すべての利用シナリオ
  • で特定の「静的」モデルを実装を気にする必要はありません
  • あなたモデルアイテムを使用すると、QObjectQ_PROPERTY
  • Yを扱っているので、あなたは自動的にQMLでバインディングの通知を取得し、あなたがモデル「スキーマ」
  • に限定されるものではなく、根本的に異なる特性を持つことができますモデルを宣言的に定義することができます。また、モデルをネストしてツリー構造を作成することもできます。ListModelで行うことはできません。
  • 実際のモデル項目を純粋なQMLで定義することができます。これは、ラピッドプロトタイピングと呼ばれる、すべての時間を再コンパイルする必要はなく、終了時にオブジェクトをC++
  • に移植するだけです。利点は、モデルは実際には通常の "リジッド"モデルよりも実装とメンテナンスがはるかに簡単です。ロールの検索はより速く、基本的には単一のobjectロールを持ち、ルックアップはありません。ロールのデータ変更信号を実装する必要はありませんなど... easy peasy
関連する問題