Question

Je suis en train de mettre un QComboBox dans un QStandardItem être utilisé dans un QStandardItemModel. J'ai regardé autour et je ne peux pas trouver une réponse, des idées?

Était-ce utile?

La solution

Vous ne stocke pas QComboBox dans un QStandardItemModel. Disons que vous avez les choix suivants:

A B C D

et vous avez une liste avec deux éléments dans une QListView, la première valeur étant A la seconde étant D:

 QListView* pView = new QListView();
 QStandardItemModel* pModel = new QStandardItemModel();
 pView->setModel(pModel);
 pModel->appendRow(new QStandardItem("A"));
 pModel->appendRow(new QStandardItem("D"));

Ce que nous avons créé ci-dessus est un widget de liste qui affiche les valeurs de « A » et « D ». Maintenant, à la QComboBox. Je suppose que vous voulez que pour modifier les valeurs de « A » et « D » dans la liste. Pour cela, vous devez créer un QItemDelegate.

Voir http://doc.qt.io/qt-4.8/qitemdelegate. html

Une tentative:

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

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

QWidget *ComboBoxDelegate::createEditor(QWidget *parent,
 const QStyleOptionViewItem &/* option */,
 const QModelIndex &/* index */) const
{
   QComboBox *editor = new QComboBox(parent);
   editor->addItem("A");
   editor->addItem("B");
   editor->addItem("C");
   editor->addItem("D");

   return editor;
}

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

   QComboBox *cBox = static_cast<QComboBox*>(editor);
   cBox->setCurrentIndex(cBox->findText(value));
}

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

   model->setData(index, value, Qt::EditRole);
}    

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

Et alors vous devez définir le délégué sur le QListView pour le faire fonctionner, voir:

pView->setItemDelegate(new ComboBoxDelegate(pView));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top