2016-06-22 38 views
1

私はQt 5.6を使用しています。私の目標は、ロードされた設定に応じてコンボボックス、エディットボックス、チェックボックス、ボタンなどの項目を設定する必要があるQTreeViewを使用してダイナミックツリーを開発することです。新しいデータがロードされると、ツリーデータが変更される可能性があります。親ノードと子ノードを持つツリーには多くのノードが配置されます。カスタムデリゲートを使用した動的qtreeview

QTreeViewを作成し、QITemDelegateまたはQStyledItemDelegateを継承したり、Qt QuickのQMLツリービューを使用して独自のデリゲートを実装するなど、このタイプのツリービューを実装するためのさまざまなオプションについて説明しました。

私の目的では、ツリーを動的に設定してパラメータを変更する最初のオプションを選択しましたが、ツリー内にデリゲートを設定する唯一のオプションとして、選択したセルに必要なデリゲートを設定することができませんsetItemDelegateForRow、setItemDelegateForColumnまたはsetItemDelegateに設定します。ツリーは以下のようになります。子ノードのそれぞれに異なる代理人を設定するにはどうすればよいですか?

by (col, row) 

Parent(cell 0,0) 
    ->Child(cell 0,1) -combo box(1,1) 
    ->Child(cell 0,2) -button(1,2) 
    ->Child(cell 0,3) -check box(1,3) 
... 
...etc 

Parent(cell 0,10) 
    ->Child(cell 0,11) - edit box(1,11) 
    ->Child(cell 0,12) - edit box(1,12) 
    ->Child(cell 0,13) - check box(1,13) 
... 
...etc 

編集

これは私がこれまでに設定私のツリービューを持っているかの簡易版です。子ノードの列1が表示されない理由は、モデルの列数を設定しなかったためです。私は以下のコードを更新して、今動作します。

enum EditType 
{ 
    TYPE_Text, 
    TYPE_CheckBox, 
    TYPE_ComboBox, 
    TYPE_Button 
}; 

QTreeView* tree = new QTreeView(this); 
QStandardItemModel* model = new QStandardItemModel; 
model->setColumnCount(2); 
tree->setModel(model); 

//set custom delegate for column 1 of the tree 
CustomDelegate *customDelegate = new CustomDelegate(this); 
tree->setItemDelegateForColumn(1, customDelegate); 

// Add parent nodes 
QStandardItem* parent1 = new QStandardItem(tr("parent1")); 
QStandardItem* parent2 = new QStandardItem(tr("parent2")); 

model->appendRow(parent1); 
model->appendRow(parent2); 

// add a child 
QList<QStandardItem*> childrow; 
QStandardItem* child = new QStandardItem(tr("child1")); 
childrow.append(child); 
QStandardItem* child_value = new QStandardItem(); 
child_value->setData(TYPE_ComboBox, Qt::UserRole); 
childrow.append(child_value); 
parent1->appendRow(it_child); 
+0

これらの点を確認してください。https://github.com/commontk/QtPropertyBrowser、https://github.com/intbots/QtPropertyBrowser、https://doc.qt.io/アーカイブ/ qq/qq18-propertybrowser.html – mvidelgauz

答えて

0

あなたがQAbstractItemView documentationからわかるように、列または行の
全体ビューの設定デリゲートのための唯一の方法は、あります。お気づきのように、この方法はsetItemDelegate,setItemDelegateForColumnsetItemDelegateForRowです。そのため、特定のセルに対してデリゲートを設定することはできません。

QTreeViewで異なるウィジェットを表示するために使用できる別の方法 - SetIndexWidgetQAbstractItemViewがあります。この機能は、データの項目に対応する 見えるエリア内の静的なコンテンツを表示するために使用されなければならない

:しかし、あなたがいることを念頭に置いておく必要があります。 カスタム動的コンテンツを表示するかカスタムエディタウィジェットを実装する場合は、代わりに QItemDelegateをサブクラス化してください。

使用SetIndexWidget方法は、非常に「高価」であり、あなたがあなたQTreeViewに多くの行を持っている場合は、パフォーマンスの低下を見ることができます。

追加:あなただけのモデルから編集データ項目のQTreeViewのウィジェットが必要な場合は 、あなたの問題を解決する最良の方法はQStyledItemDelegateを再実装されます。メソッドcreateEditorを探します。

追加: Example of reimplement QStyledItemDelegate

+0

あなたのご意見ありがとうございます。私のtreeviewは多くのデータセットを含んでいるので、おそらくsetIndexWidgetを使うのは良いことではありません。 QStyledItemDelegateを再実装し、createEditorを変更してQModelIndexインデックスに応じてエディタを設定すると、モデル内の特定の子セルにどのように設定するのですか? – ccptleu

+0

特にセルになる特定のウィジェットを知っているなら、あなたはこのセルのQModelIndexを知っています。 createEditorを再実装するときは、特定のQModelIndex用の特定のウィジェットを返す必要があります。私は問題を見ない。アルゴリズムは、どのウィジェットが特定のセルに属していなければならないかを判断する際に使用するものと同じです。たとえば、最初の列の場合、SomeWidgetを編集に使用する場合は、createEditorの再実装でそのような検査を行います。if(index.column()== 0)SomeWidgetを返します。このようなもの。 –

+0

実際に私はその質問をした後、最初の投稿に編集で追加した解決策を実装しました。ありがとう! – ccptleu

関連する問題