Frage

Ich versuche, eine QComboBox in eine QStandardItem zu setzen, um in einem QStandardItemModel verwendet werden. Ich habe mich um und ich kann keine Antwort, keine Ideen finden?

War es hilfreich?

Lösung

Sie speichern Sie keinen QComboBox in einem QStandardItemModel. Angenommen, Sie haben folgende Möglichkeiten:

A B C D

und Sie haben eine Liste mit zwei Elementen in einem QListView, wobei der erste Wert A der zweite Wesen D:

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

Was wir oben erstellt eine Liste Widget, das die Werte von „A“ angezeigt wird und „D“. Nun, zum QComboBox. Ich nehme an, Sie wollen, dass die Werte von „A“ und „D“ in der Liste zu bearbeiten. Dazu benötigen Sie einen QItemDelegate erstellen.

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

Ein Versuch:

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

Und dann müssen Sie die Delegierten auf dem QListView setzen, damit es funktioniert, finden Sie unter:

pView->setItemDelegate(new ComboBoxDelegate(pView));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top