如何在QTreeView中添加不同类型的代理

如何在QTreeView中添加不同类型的代理,qt,qtreeview,qitemdelegate,qstyleditemdelegate,Qt,Qtreeview,Qitemdelegate,Qstyleditemdelegate,我想创建与附图所示相同类型的QTreeView(不是QTreeWidget)结构。。这是QT的属性编辑器。 我正在使用QT-4.6 在第二列,根据不同的条件,我可以有一个旋转框,或下拉框,或复选框或文本编辑。。。等等 请指导我如何在特定列的不同单元格中设置不同的委托。 从文档中可以明显看出,没有直接的API用于在单元格上设置委托(而是可用于完整的小部件、行或列)。所有qabstractemdelegate方法,如createEditor或paint,都有一个模型索引作为其参数之一。您可以使用该

我想创建与附图所示相同类型的QTreeView(不是QTreeWidget)结构。。这是QT的属性编辑器。 我正在使用QT-4.6

在第二列,根据不同的条件,我可以有一个旋转框,或下拉框,或复选框或文本编辑。。。等等 请指导我如何在特定列的不同单元格中设置不同的委托。
从文档中可以明显看出,没有直接的API用于在单元格上设置委托(而是可用于完整的小部件、行或列)。

所有
qabstractemdelegate
方法,如
createEditor
paint
,都有一个模型索引作为其参数之一。您可以使用该索引访问模型数据,并创建适当的委托小部件。创建模型时,应为每个用于区分其类型的项目设置一些值

例如:

enum DelegateType
{
    DT_Text,
    DT_Checkbox,
    DT_Combo
}

const int MyTypeRole = Qt::UserRole + 1;

QStandardItemModel* createModel()
{
    QStandardItemModel *model = new QStandardItemModel;

    QStandardItem *item = new QStandardItem;
    item->setText("Hello!");
    item->setData(DT_Checkbox, MyTypeRole);

    model->appendRow(item);

    return model;
}

QWidget* MyDelegate::createEditor(QWidget *parent, 
                                  const QStyleOptionViewItem &option, 
                                  const QModelIndex &index) const
{
    int type = index.data(MyTypeRole).toInt();

    // this is a simplified example
    switch (type)
    {
    case DT_Text:
        return new QLinedEdit;
    case DT_Checkbox:
        return new QCheckBox;
    case DT_Combo:
        return new QComboBox;
    default:
        return QItemDelegate::createEditor(parent, option, index);
    }
}

@汉克,这是对你最后一句话的回应。。。你看到它有什么缺点吗

   MyItem* item2 = new MyItem(second);
    item2->setData(delType, **MyTypeRole**);
    if(delType == DT_Combo)
    {
        QString str1, str2, str3;
        QStringList abc ;
        abc << ("1" + str1.setNum(counter) ) << ("2" + str2.setNum(counter) )<< ( "3" + str3.setNum(counter) );
        item2->setData(abc, MyTypeRole1);
    }

QWidget* MyDelegate::createEditor(QWidget *parent, 
                                  const QStyleOptionViewItem &option, 
                                  const QModelIndex &index) const
{
    int type = index.data(MyTypeRole).toInt();

    // this is a simplified example
switch (type)
{
case DT_Text:
    return new QLinedEdit;
case DT_Combo:
{
QComboBox* cb = new QComboBox(parent);
QStringList entries - index.data(MyTypeRole1).toStringList();
cb->addItems(entries)
return cb;
}
MyItem*item2=新的MyItem(第二个);
item2->setData(delType,**MyTypeRole**);
if(delType==DT_组合)
{
QString str1、str2、str3;
QStringList-abc;

abc如果你确实需要一个属性编辑器,那么你可以重用Qt Designer中的一个。还有另一个基于Qt的开源库,它使用自定义编辑器实现通用属性表。我现在忘记了它的名称。还有一个问题:在不同的项上会有多个组合框。现在我希望在dif中出现不同的值不同的组合框。例如:如果项目1有一个组合框,我想将条目显示为“a”、“b”和“c”。对于项目4,组合框中的条目应为“d”、“e”、“f”使用上述解决方案实现这一目标的最佳方法是什么?在这种情况下,您应该有两种不同类型的组合框。例如,您有一个字体大小组合框和一个字体颜色组合框。每个组合框将以不同的方式处理原始模型数据。让我们假设一个项可以有原始值“1”、“2”、“3”。然后第一个组合应显示“小”、“中”、“大”,第二个组合应显示“红”、“蓝”、“黑”。