2009-08-30 16 views
3

私はProductオブジェクトのリストを(行として)持っています。各オブジェクトには、商品ID、製品ファミリなどのいくつかのデータフィールドが列としてあります。私は、QAbstractTableModelをサブクラス化するテーブルモデルを作成し、そのデータをQTableViewに表示することができました。Qtモデルのツリービューとテーブルビュー

私が望むのは、ツリーのような構造でモデルの「グループ化」ビューを提供することです。たとえば、製品をファミリIDでグループ化したいので、ツリーにはグループ(ファミリID)とその子がそのファミリIDを持つ製品である必要があります。

アイデア?

PS: 複数のグループ(家族のIDを有するグループ、および別の列でグループにそれらを、など)の必要性は、モデルが木でなければならないことを私に示しています。ルートノードはグループを示し、子はグループメンバーです。複数のグループ化は、複数レベルのツリーによって実現できます。

その後、私の変換の質問は以下の通りです:どのように私は(与えられたレベルで)のみのツリーの葉を表示する特殊なQTableViewクラスを実装することができますか?

私はtableviewでsetRootIndexを使うことができますが、何も解決しません。他の葉は表示されません。実際には葉は実際のオブジェクトです。

Iは少し掘り、各行と列を表示する際QTableView :: paintEventで、実際のアイテムのようなフェッチされることが見出された:

CONST QModelIndexインデックス= D->モデル - >インデックス(行、col、d->ルート);

ここで、d-> root()はsetRootIndex()によって与えられるルートノードです。これはツリートラバーサルコードに埋め込まれていなければならず、すべてがうまくいくはずです。しかし、私はどのようにpaintEventメソッド全体を再実装するのを避けることができますか?あなたはQTreeWidgetが最も簡単なルートであるかもしれないしたいどのくらいのカスタマイズによっては

+0

ソート順序が変更されたときに同じように(ファミリIDでの場合と同じように)グループ化したい、またはグループ化を変更したいですか?最初のものはかなり簡単で、2番目のものはそうではありません。 –

+0

私は単純なツリーモデルを作成し、それを異なるビューに設定しました。下の例は、ツリービューをどのように表示したいかを示していますが、テーブルビューではファミリではない製品が表示されます。 テーブルビューにモデルの2番目のレベルのノードが表示されるように設定するにはどうすればよいですか? コードはここにあります: http://www.stud.u-szeged.hu/Veress.Krisztian/main.cpp –

+1

ここにあなたのコードを掲載すれば、それは検索可能になり、すべて見ることができます –

答えて

1

が、あなたはすでにモデルを持っている場合、それはあなたが由来する1に依存します。機能性を得るためには、すでに構築した行に子構造を追加する必要があります。あなたはそれを見逃しているかもしれませんが、 'QModelIndex'クラスは '親'フィールドを持っています。これは階層構造を構築するのに役立ちます。

あなたは、おそらくうまくQStandardItemQStandardItemModelのクラスを取ることによって提供されます。階層構造の各レベルを表示するために必要なデータには、異なる数の列を持たせることができ、深さには制限がないため、ツリー構造を構築するための適切なインターフェースがあります。あなたは冒険を感じた場合は

あなたは上からそれを取るとちょうどQAbstractItemModelインタフェースを実装し、それは右時々得るために難しいことができますすることができます。例

については

全体的に私はこれが原因QAbstractItemModel(行、列、親/子と役割)にあるdimenionalitiesの量にQTで奇妙な概念の一つであると考えて

for (int i = 0; i < 3; ++i) { 
    QStandardItem *parent= new QStandardItem("Family " + QString::number(i),this); 
    item->setRowCount(3); 
    for (int j = 0; j < 3; ++j) { 
     QStandardItem *child = new QStandardItem("Child " + QString::number(i*3+j), this); 
     parent->setChild(j,child); 
    } 
    model->appendRow(parent); 
} 

免責事項:これは...

をコンパイルされていません。しかし、あなたはアイテムではなく、モデルに子を追加する必要が見ることができるように、各項目は、項目の階層を含めることができます。

関連する問題