我正在使用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);
答案 0 :(得分:0)
从QAbstractItemView documentation可以看出,只有方法可以设置委托代表
整个视图,用于列或行。如您所知,此方法包括:setItemDelegate
,setItemDelegateForColumn
,setItemDelegateForRow
。这就是为什么你不能为某个单元格设置委托的原因。
还有另一种方法,您可以使用它在QTreeView中显示不同的小部件 - QAbstractItemView
的方法SetIndexWidget。但你必须记住:
此功能仅用于显示内部的静态内容 对应于数据项的可见区域。如果要显示 自定义动态内容或实现自定义编辑器窗口小部件,子类 相反,QItemDelegate。
使用SetIndexWidget
方法非常昂贵&#34;如果您QTreeView
中有很多行,则可以看到性能下降。
<强>增加:强>
如果您只需要在QTreeView中使用小部件来编辑模型中的数据项,那么解决问题的最佳方法就是重新实现QStyledItemDelegate。寻找方法createEditor
。