如何在QTreeView中添加不同类型的委托

How to add different types of delegates in QTreeView

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

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

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

一个例子:

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);
    }
}

@hank 这是对您上一条评论的回应...您看到其中有什么瑕疵吗?

   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;
}


在不同的 item2 上,我动态创建了一个带有计数器变量的条目,每次它来到这里时都是不同的...... 这里,不同的组合框显示不同的条目。
您觉得这种方法好吗?