2009-05-15 3 views
7

私は(Py)Qt初心者です。QtのGUIコードを数日間移植しています。私が尋ねる質問の1つは、parent()メソッドを提供するのに、QAbstractItemModelサブクラスが必要な理由と、結果としてQModelIndexに親の子の行を指定する必要がある理由です。QAbstractItemModel.parent()、なぜですか?

この要件では、ツリーインデックスにindexOf(item)parent()を呼びたくないので、あまり効率的ではありません)という行インデックスを覚えておく必要があります。

私はモデルベースのビューがこれを必要とするのを初めて見るので、これを尋ねます。たとえば、CocoaのNSOutlineViewDataSourceはこれを必要としません。

Trolltech開発者はスマートな人ですから、これには正当な理由があると確信しています。私はただの理由を知りたいだけです。

答えて

7

クイックアンサーは、「彼らは当時は最高だと思った。 Qtの開発者はあなたと私のような人々です。彼らは完璧ではなく、間違いを犯しています。彼らはその経験から学び、その結果はItemviews-NGの形での作品にあります。上記のリンクから自分の言葉で

は部屋の多く、改善の余地があるとだけ言うのをしてみましょう!

行と列のインデックスを含む親を提供することにより、ツリーを実装してナビゲーションをサポートする1​​つの方法を提供します。より明白なグラフの実装を簡単に使用できます。

+0

ブログの投稿リンクをありがとう。興味深いことに、誰もが工学上の罠に陥ることがあります。 –

2

要件は主にツリーをサポートすることです。私はQtの開発者ではないので、私は理由を教えてくれませんでした...私はそのものだけを使用します。しかし、ツリーをやっていないのであれば、もっと調整されたモデルクラスの1つを使うことができ、親に供給するオーバーヘッドに対処する必要はありません。私はQAbstractListModelQAbstractTableModelの両方が自分自身で親部分を扱うと考えています。あなたが望むデータについて気にする必要はありません。

木の場合、親が必要な理由の1つは、描画する必要がある情報のみを要求するようにすることです。ツリー内のすべての項目を知らなくても(たとえば、展開されていない場合)、ツリー内の特定の項目の絶対位置を指定することはずっと難しくなります。親関数でindexOf(item)を使用してのquandryについては

は、あなたがQModelIndex年代internalIdinternalPointerを使用して考えがありますか?私は彼らがPyQtで利用可能であると仮定しています...彼らはあなたのモデルでインデックスについての事を追跡するために使うことができます。あなたは親のインデックスを見つける手間を短縮するためにそれを使うことができます。

+1

私はQAbstractListModelについて知っています。私は木のモデルが必要です。私はinternalPointerも知っていて使います。しかし、私が余分なレイヤーが必要だと言う理由は、私のモデルでは、ツリーノードの子は行インデックスについて知りません(彼らは知る必要はありません)。だからinternalPointer()が私に子供のインスタンスへのポインタを与えても、私はまだchild.parent.indexOf(子)を呼び出さなければなりません(Qtデモモデルのモデルでさえ...)。 NSOutlineViewDataSource(ツリービューのモデルでも)がQtにこの情報が必要な理由を本当に知りたいのですが。 –

関連する問題