2010-06-28 11 views
8

मैं एक QStomboItem में QQandardItemModel में उपयोग करने के लिए QStomboItem में डालने का प्रयास कर रहा हूं। मैं चारों ओर देख रहा हूं और मुझे कोई जवाब नहीं मिल रहा है, कोई विचार?QStandardItem + QComboBox

+1

इस उत्तर से एक के लिए मेरी प्रश्न आपको स्वागत के रूप में मदद कर सकते हैं: http://stackoverflow.com/questions/6764790/which-model-to-subclass-view-to-use-for-a-list-of-custom-objects/6769603#6769603 – Sam

उत्तर

12

आप QStandardItemModel में QComboBox स्टोर नहीं करते हैं। मान लीजिए कि आप निम्नलिखित विकल्प हैं करते हैं:

एक बी सी डी

और आप एक QListView, पहले मूल्य एक दूसरे से किया जा रहा डी होने में दो आइटम के साथ एक सूची है:

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

हमने जो बनाया है वह एक सूची विजेट है जो "ए" और "डी" के मान प्रदर्शित करेगा। अब, QComboBox के लिए। मुझे लगता है कि आप सूची में "ए" और "डी" के मानों को संपादित करना चाहते हैं। इसके लिए, आपको 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)); 
संबंधित मुद्दे