2

私の質問はQtとそのQAbstractItemModelについてです。

std::map<stringclass, double>Qtウィジェットに表示したい文字列とdouble()のマップがあります。そのためにQTableViewを使用することもできますが、マップのキーが「 」で始まる複数の文字列、さらにabc.def.ghiは「」で始まる複数の文字列が存在する可能性があるという事実を利用したいと思います。abc.defabc

そこで、 QTreeViewでアイテムを表示するようにツリーデータモデルを設定したいと思います。

(-) abc
    |--(-)def      
          |--ghi    3.1415
          |--jkl    42.0815
    |--(+)pqr
    |--(+)xyz

私の鍵はstd::mapツリーの葉です。他のすべてのノードは、ユーザーの便宜のために折り畳みをサポートするための一時的で補助的な構造になります。

残念ながら、メソッド、、、rowCountおよびにはconst-modifiersがあるため、QAbstractItemModel派生内のヘッダーの補助データ構造を単純に設定して、そのデータ構造を変更することはできません。indexcolumnCountdata

そのためのベストプラクティスは何でしょうか?自分std::mapQAbstractItemModelの間に別のクラスレイヤーを設定する必要がありますか、それともこれを行うためのよりスマートな方法がありますか?


編集1:QTreeViewが表示および使用されているstd::map間に変更される可能性があるため、補助ノードが破棄されて再構築される可能性があります。私の仮定は、これを処理する最良の方法はQAbstractItemModelを再構築することです-または、単にそのモデルを破棄して、新しく構築されたモデルをQTreeViewに割り当てる必要がありますか?その場合、メソッドの定数に煩わされることなく、コンストラクター内のすべてのノードをセットアップできたと思います。

4

2 に答える 2

4

マップを解析し、それに基づいてツリーデータ構造を作成します。マップを変更するときは、必ずモデルを同期してください。この同期手順が複雑になりすぎる場合は、最初からデータをツリー構造で保持し、必要に応じてマップに変換することをお勧めします。

モデル関数でその場でマップを解析することは私には悪い考えのように思えます。これらの関数をできるだけ高速にする必要があります。

于 2010-02-01T16:56:16.720 に答える
0

const-modifiersが実際にどのように問題になるかわかりません。

、、、およびメソッドが呼び出されたときに、派生QAbstractItemModel物のどのメンバーを変更しますか?マップへの参照を保存し、そこからすべてを計算することもできます。必要な情報を抽出するためにマップ自体を変更する必要はありません(私が知る限り!)。rowCountindexcolumnCountdata

EDIT1とコメントの後にEDIT
マップを変更する必要がある場合は、それを独自のクラスの基本構造として使用します。モデルの存続期間がマップの存続期間を超える可能性があるためにマップへの参照を保持できない場合は、スマートポインターを使用して、それが発生しないことを確認してください。

于 2010-02-01T11:07:24.670 に答える