2010-06-28 99 views
8

我想把一个QComboBox放入一个QStandardItem中以用于QStandardItemModel。我一直在四处寻找,我找不到答案,有什么想法?QStandardItem + QComboBox

+1

这回答了一个我问题可能会帮助你:http://stackoverflow.com/questions/6764790/which-model-to-subclass-view-to-use-for-a-list-of-custom-objects/6769603#6769603 – Sam 2011-07-24 09:35:56

回答

12

您不要将QComboBox存储在QStandardItemModel中。比方说,你有以下选择:

一个 乙 Ç d

,你必须在一个而QListView,第一个值是一个第二个是d两个项目的列表:

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

我们上面创建的是一个列表窗口小部件,它将显示“A”和“D”的值。现在,到QComboBox。我假设你想要在列表中编辑“A”和“D”的值。为此,您需要创建一个QItemDelegate。

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

尝试:

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

然后你需要设置代理上而QListView,使其工作,请参阅:

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