2010-06-28 11 views
8

Estoy tratando de poner un QComboBox en un QStandardItem para ser utilizado en un QStandardItemModel. He estado mirando alrededor y no puedo encontrar una respuesta, ¿alguna idea?QStandardItem + QComboBox

+1

Esta respuesta a una de mis Las preguntas también pueden serle de ayuda: http://stackoverflow.com/questions/6764790/which-model-to-subclass-view-to-use-for-a-list-of-custom-objects/6769603#6769603 – Sam

Respuesta

12

No almacena un QComboBox en un QStandardItemModel. Digamos que usted tiene las siguientes opciones:

Un B C D

y usted tiene una lista con dos elementos de una QListView, siendo el primer valor A al ser segundo D:

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

Lo que creamos anteriormente es un widget de lista que mostrará los valores de "A" y "D". Ahora, a QComboBox. Supongo que quiere que edite los valores de "A" y "D" en la lista. Para esto, necesita crear un QItemDelegate.

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

Un intento:

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

Y a continuación, es necesario configurar el delegado en la QListView para hacer que funcione, consulte:

pView->setItemDelegate(new ComboBoxDelegate(pView)); 
Cuestiones relacionadas