2010-06-28 98 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));