2015-03-20 1 views
1

J'ai dérivé une classe de QStyledItemDelegate. J'utilise un QComboBox dans ce délégué. Ce délégué est utilisé dans QTableView.Pointeur d'accès à QWidget (Combobox) du customdelegate

Ma question est, comment puis-je changer l'indice de la Combobox dans le délégué par programme comment accéder au pointeur vers ce widget en dehors de la classe de délégué? J'ai vérifié que CreateEditor, SetEditorData, SetModelData les fonctions (de QStyledItemDelegate) sont appelées automatiquement lorsque nous cliquons sur la liste déroulante et nous ne pouvons pas les appeler manuellement pour manipuler les données dans le modèle.

Répondre

1

Chaque fois que vous commencez à éditer et que la liste déroulante est affichée, elle en alloue une nouvelle. si vous voulez avoir un combobox permanent, vous devriez regarder

QTableView::setIndexWidget(const QModelIndex&, QWidget*)

pour que vous puissiez accéder au combobox avec le code suivant:

const QMoodelIndex idx = model->index(row, column); 
QWidget* wid = view->indexWidget(idx); 
QComboBox* box = qobject_cast<QComboBox*>(wid); 
if (box) 
    // do your thing 
0

Vous pouvez avoir le contenu de votre combobox en tant que membre de classe de votre délégué dans un QStringList. Votre délégué de l'article peut être comme:

#include <QStyledItemDelegate> 

#include <QComboBox> 

class ComboBoxDelegate: public QStyledItemDelegate 
{ 
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; 

    QStringList comboItems; 

    mutable QComboBox *combo; 

private slots: 

    void setData(int val); 

}; 

ComboBoxDelegate::ComboBoxDelegate(QObject *parent):QStyledItemDelegate(parent) 
{ 
} 

QWidget *ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    combo = new QComboBox(parent); 
    QObject::connect(combo,SIGNAL(currentIndexChanged(int)),this,SLOT(setData(int))); 
    combo->addItems(comboItems); 
    combo->setMaxVisibleItems(comboItems.count()); 
    return combo; 
} 

void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const 
{ 
    QString text = index.model()->data(index, Qt::DisplayRole).toString(); 

    int comboIndex = comboItems.indexOf(QRegExp(text)); 

    if(comboIndex>=0) 
     (static_cast<QComboBox*>(editor))->setCurrentIndex(comboIndex); 
} 

void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const 
{ 
    model->setData(index, static_cast<QComboBox*>(editor)->currentText()); 
} 


void ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    editor->setGeometry(option.rect); 
} 

void ComboBoxDelegate::setData(int val) 
{ 
    emit commitData(combo); 
    //emit closeEditor(combo); 
} 

Lorsque vous souhaitez mettre à jour les éléments combobox quelque part dans votre code juste obtenir un pointeur au délégué de l'élément en appelant itemDelegateForColumn et accéder au membre comboItems:

ComboBoxDelegate * itemDelegate = qobject_cast<ComboBoxDelegate *>(ui->tableView->itemDelegateForColumn(columnIndex)); 

//Updating combobox items 
itemDelegate->comboItems.append("newItem"); 
... 
+0

Le problème avec cette solution est que Combox de la variable membre doit être définie en premier afin de manipuler les données. qui sera défini dès que je clique sur la liste déroulante dans le itemdelegate. J'ai donc accédé au modèle et à la norme et changé le texte plutôt que de manipuler l'index de la combobox. – user1703942

+0

Je ne comprends pas ce que vous voulez dire. Vous ne voulez pas modifier les éléments dans la zone de liste déroulante? – Nejat

+0

Non, je voulais, mais les comboItems seront ajoutés à la comboBox, quand le 'createEditor' est appelé, qui est seulement appelé quand nous interagissons avec le Combobox en utilisant la souris. – user1703942