Vous pouvez avoir le contenu de votre combobox en tant que membre de classe de votre délégué dans un QStringList
. Votre délégué de l'article peut être comme:
#include <QStyledItemDelegate>
#include <QComboBox>
class ComboBoxDelegate: public QStyledItemDelegate
{
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):QStyledItemDelegate(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);
}
Lorsque vous souhaitez mettre à jour les éléments combobox quelque part dans votre code juste obtenir un pointeur au délégué de l'élément en appelant itemDelegateForColumn
et accéder au membre comboItems
:
ComboBoxDelegate * itemDelegate = qobject_cast<ComboBoxDelegate *>(ui->tableView->itemDelegateForColumn(columnIndex));
//Updating combobox items
itemDelegate->comboItems.append("newItem");
...
Le problème avec cette solution est que Combox de la variable membre doit être définie en premier afin de manipuler les données. qui sera défini dès que je clique sur la liste déroulante dans le itemdelegate. J'ai donc accédé au modèle et à la norme et changé le texte plutôt que de manipuler l'index de la combobox. – user1703942
Je ne comprends pas ce que vous voulez dire. Vous ne voulez pas modifier les éléments dans la zone de liste déroulante? – Nejat
Non, je voulais, mais les comboItems seront ajoutés à la comboBox, quand le 'createEditor' est appelé, qui est seulement appelé quand nous interagissons avec le Combobox en utilisant la souris. – user1703942