动态qtreeview与自定义代理

时间:2016-06-22 15:48:15

标签: c++ qt qtreeview

我正在使用Qt 5.6,我的目标是使用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);

1 个答案:

答案 0 :(得分:0)

QAbstractItemView documentation可以看出,只有方法可以设置委托代表 整个视图,用于列或行。如您所知,此方法包括:setItemDelegatesetItemDelegateForColumnsetItemDelegateForRow。这就是为什么你不能为某个单元格设置委托的原因。

还有另一种方法,您可以使用它在QTreeView中显示不同的小部件 - QAbstractItemView的方法SetIndexWidget。但你必须记住:

  

此功能仅用于显示内部的静态内容   对应于数据项的可见区域。如果要显示   自定义动态内容或实现自定义编辑器窗口小部件,子类   相反,QItemDelegate。

使用SetIndexWidget方法非常昂贵&#34;如果您QTreeView中有很多行,则可以看到性能下降。

<强>增加: 如果您只需要在QTreeView中使用小部件来编辑模型中的数据项,那么解决问题的最佳方法就是重新实现QStyledItemDelegate。寻找方法createEditor

<强>增加: Example of reimplement QStyledItemDelegate