2016-06-22 3 views
1

Я использую Qt 5.6, и моя цель - разработать динамическое дерево с использованием QTreeView, которое должно заполнить такие элементы, как комбинированные поля, поле редактирования, флажок, кнопки..etc в зависимости от загруженных настроек и данные дерева могут изменяться по мере загрузки новых данных. В дереве будет множество узлов для заполнения родительским и дочерним узлами.динамический qtreeview с пользовательскими делегатами

Я читал о различных вариантах реализации такого типа древовидного типа, например, заполнении QTreeView и реализации моего собственного делегата путем наследования от QITemDelegate или QStyledItemDelegate или с помощью Qt-кода Qt treeview.

Для моих целей я выбрал первый вариант динамического заполнения дерева и изменения параметров, но у меня возникли проблемы с настройкой делегата, который я хочу для выбранной ячейки, только в качестве единственных опций для назначения делегата в дереве to 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, setItemDelegateForColumn, setItemDelegateForRow. Вот почему вы не можете установить делегат для определенной ячейки.

Существует другой способ, который вы можете использовать для отображения различных виджетов в QTreeView - метод SetIndexWidget из QAbstractItemView. Но вы должны иметь в виду, что:

Эта функция должна быть использована только для отображения статического контента в пределах видимой области , соответствующей элементу данных. Если вы хотите отобразить пользовательский динамический контент или реализовать собственный виджет редактора, вместо него должен быть подкласс QItemDelegate.

Используйте SetIndexWidget метод очень «дорого», и если у вас есть много строк в вас QTreeView, вы можете увидеть снижение производительности.

Дополнение Если вам нужны виджеты в QTreeView только для редактирования элементов данных модели, наилучшим образом решить вас проблема будет переописать QStyledItemDelegate. Ищите метод createEditor.

Дополнение Example of reimplement QStyledItemDelegate

+0

Спасибо за ваш вклад. Поскольку мое древовидное представление велико, содержащее множество наборов данных, вероятно, не очень удобно использовать setIndexWidget. Если я переопределяю QStyledItemDelegate и изменим createEditor, чтобы установить редактор в зависимости от индекса QModelIndex, как установить его для определенной дочерней ячейки в моей модели? – ccptleu

+0

Если вы знаете конкретный виджет, который будет в определенной ячейке, вы знаете QModelIndex для этой ячейки. Когда вы переопределяете createEditor, вы должны вернуть определенный виджет для определенного QModelIndex. Я не вижу проблемы. Алгоритм такой же, как и при определении того, какой виджет должен находиться в конкретной ячейке. Например, если для первого столбца вы будете использовать SomeWidget для редактирования, выполните такую ​​проверку в reimplementation createEditor: if (index.column() == 0) верните SomeWidget; Что-то вроде этого. –

+0

На самом деле после того, как я сделал этот вопрос, с тех пор я реализовал решение, которое я добавил в редактировании для своего первого сообщения. Благодаря! – ccptleu

Смежные вопросы