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

时间:2016-02-05 18:37:36

标签: qt qtreeview qitemdelegate qstyleditemdelegate

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

enter image description here

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

@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上,我动态创建带有计数器变量的条目,每次进入时它都是不同的... 这里,不同的组合框显示不同的条目 这种方法看起来不错吗?