刷新用作QTableView中编辑器的QComboBox中的选项

时间:2014-05-18 13:27:16

标签: c++ qt combobox tableview

我在Qt的QComboxBox中使用了QTableView。当我添加一个新行时,我的委托的createEditor()被调用,我可以用当时可用的正确选择集来实例化组合框。问题是,用户可以在表外加载不同的文件,并根据文件的内容,组合框需要更新其项目。 有没有办法让我可以得到一个单元格的编辑器,以便我可以相应地更新选择?由于表中的其他单元不应该被破坏,我不能简单地用新数据重新创建表,我只需要更新某些单元的组合框。

我一直在寻找QAbstractItemView的源代码,并且有一个函数editorForIndex(),这正是我需要的,但这是在视图中私有实现的,因此无法访问甚至在派生类中。 当然我可以保留我创建的框的记录,以便稍后我可以相应地更新它们,但我想知道是否真的没有其他方法可以做到这一点。

1 个答案:

答案 0 :(得分:0)

您可以在QStringList中将组合框的内容作为代理人的班级成员。您的项目委托可以是:

#include <QItemDelegate>

#include <QComboBox>

class ComboBoxDelegate: public QItemDelegate
{
 Q_OBJECT
public:
    ComboBoxDelegate(QObject *parent = 0);

    QWidget *createEditor( QWidget *parent,
                            const QStyleOptionViewItem &option,
                            const QModelIndex &index ) const;

    void setEditorData( QWidget *editor,
                            const QModelIndex &index ) const;

    void setModelData( QWidget *editor,
                            QAbstractItemModel *model,
                            const QModelIndex &index ) const;

    void updateEditorGeometry( QWidget *editor,
                            const QStyleOptionViewItem &option,
                            const QModelIndex &index ) const;

    QStringList comboItems;

    mutable QComboBox *combo;

private slots:

    void setData(int val);

};

ComboBoxDelegate::ComboBoxDelegate(QObject *parent ):QItemDelegate(parent)
{
}

QWidget *ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    combo = new QComboBox( parent );
    QObject::connect(combo,SIGNAL(currentIndexChanged(int)),this,SLOT(setData(int)));
    combo->addItems(comboItems);
    combo->setMaxVisibleItems(comboItems.count());
    return combo;
}

void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString text = index.model()->data( index, Qt::DisplayRole ).toString();

    int comboIndex = comboItems.indexOf(QRegExp(text));

    if(comboIndex>=0)
        (static_cast<QComboBox*>( editor ))->setCurrentIndex(comboIndex);
}

void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    model->setData( index, static_cast<QComboBox*>( editor )->currentText() );
}


void ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry( option.rect );
}

void ComboBoxDelegate::setData(int val)
{
    emit commitData(combo);
    //emit closeEditor(combo);
}

如果要更新代码中某处的组合框中的项目,只需调用itemDelegateForColumn并访问comboItems成员即可获得指向项目委托的指针:

ComboBoxDelegate * itemDelegate = (ComboBoxDelegate *)ui->tableView->itemDelegateForColumn(columnIndex);

//Updating combobox items
itemDelegate->comboItems.append("newItem");
...