gpt4 book ai didi

c++ - 具有自定义委托(delegate)的动态 qtreeview

转载 作者:太空宇宙 更新时间:2023-11-04 13:14:35 27 4
gpt4 key购买 nike

我正在使用 Qt 5.6,我的目标是使用 QTreeView 开发一个动态树,它需要根据加载的设置填充组合框、编辑框、复选框、按钮等项目,并且树数据可以更改随着新数据的加载。将有许多节点填充在具有父节点和子节点的树中。

我已经了解了实现这种类型的 TreeView 的不同选项,例如填充 QTreeView 并通过继承自 QITemDelegate 或 QStyledItemDelegate 或使用 Qt Quick 的 QML TreeView 实现我自己的委托(delegate)。

为了我的目的,我选择了第一个选项来动态填充树和修改参数,但是我在设置我想要的选定单元格的委托(delegate)时遇到了麻烦,因为在树中设置委托(delegate)的唯一选项是setItemDelegateForRow、setItemDelegateForColumn 或 setItemDelegate。这棵树看起来像下面这样。我应该如何为每个子节点设置不同的委托(delegate)?

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

编辑

这是到目前为止我如何设置 TreeView 的简化版本。找出为什么我的子节点第 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);

最佳答案

QAbstractItemView documentation可以看出,只有设置委托(delegate)的方法
整个 View ,列或行。如您所见,这些方法是:setItemDelegatesetItemDelegateForColumnsetItemDelegateForRow。这就是为什么你不能为某些单元格设置委托(delegate)。

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

This function should only be used to display static content within the visible area corresponding to an item of data. If you want to display custom dynamic content or implement a custom editor widget, subclass QItemDelegate instead.

使用 SetIndexWidget 方法非常“昂贵”,如果您在 QTreeView 中有很多行,您会看到性能下降。

添加:如果您只需要 QTreeView 中的小部件来编辑模型中的数据项,那么解决问题的最佳方法是重新实现 QStyledItemDelegate .寻找方法 createEditor

添加: Example of reimplement QStyledItemDelegate

关于c++ - 具有自定义委托(delegate)的动态 qtreeview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37972839/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com