Обновление выбора в QComboBox, используемом в качестве редактора в QTableView

Я использую QComboxBox в QTableView в Qt. Когда я добавляю новую строку, то createEditor() моего делегата вызван, и я могу создать комбо-бокс с правильным набором вариантов, доступных в то время. Проблема заключается в том, что пользователь может загружать разные файлы вне таблицы, и в зависимости от содержимого файла выпадающий список должен будет обновлять свои элементы.
Есть ли способ, которым я могу получить редактор ячейки, чтобы я мог соответственно обновить варианты? Поскольку другие ячейки таблицы не должны быть уничтожены, я не могу просто воссоздать таблицу с новыми данными, мне нужно только обновить комбинированные списки определенных ячеек.

Я искал в исходном коде QAbstractItemView и есть функция editorForIndex() это было бы именно то, что мне нужно, но это реализовано конфиденциально внутри представления, поэтому оно не доступно даже в производном классе.
Конечно, я могу вести учет созданных ящиков, чтобы впоследствии соответствующим образом обновить их, но мне интересно, нет ли другого способа сделать это.

1

Решение

Вы можете иметь содержимое вашего списка в качестве члена класса вашего делегата в 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");
...
0

Другие решения


По вопросам рекламы [email protected]