2012-03-16 1 views
0

J'ai besoin d'implémenter une table dans Qt qui montre un QComboBox sur chaque ligne sur une colonne particulière.Qt, QStandarItemModel: éléments de délégation sur QComboBox personnalisé remplissant son contenu à partir de l'instanciation du modèle.

Basé sur cette question: QStandardItem + QComboBox J'ai réussi à créer un QItemDelegate. Dans cet exemple, le contenu de QComboBox est défini statiquement sur la classe ComboBoxDelegate, mais dans mon cas, j'ai besoin de définir le contenu de QComboBox dans la fonction où le QStandardItemModel est créé.

Le modèle est défini à l'intérieur d'une méthode de classe MainWindow:

void MainWindow::fooHandler() { 
    QStandardItemModel* mymodel = new QStandardItemModel; 
    ui->tablePoint->setModel(mymodel); 
    ComboBoxDelegate* delegate=new ComboBoxDelegate; 
    ui->tablePoint->setItemDelegateForColumn(2,delegate); 

    QStringList Pets; 
    Pets.append("cat"); 
    Pets.append("dog"); 
    Pets.append("parrot"); 

    // So far this is how I tried to store data under Qt::UserRole in "mymodel": 

    QModelIndex idx = mymodel->index(0, 2, QModelIndex()); 
    mymodel->setData(idx,QVariant::fromValue(Pets), Qt::UserRole); 

    //Now i fill the table with some values... 
    QList< QStandardItem * > items; 
    items.clear(); 
    items << new QStandardItem("col0"); 
    items << new QStandardItem("col1"); 
    items << new QStandardItem("parrot"); 
    items << new QStandardItem("col3"); 
    mymodel->appendRow(items); 

    items.clear(); 
    items << new QStandardItem("col0"); 
    items << new QStandardItem("col1"); 
    items << new QStandardItem("cat"); 
    items << new QStandardItem("col3"); 
    mymodel->appendRow(items); 
    } 

alors je devrais être en mesure de récupérer le contenu ComboBox de la classe déléguée:

void ComboBoxDelegate::setEditorData(QWidget *editor, 
            const QModelIndex &index) const 
    { 
    QString value = index.model()->data(index, Qt::EditRole).toString(); 
    QComboBox *cBox = static_cast<QComboBox*>(editor); 

    if(index.column()==2) { 
     QModelIndex idx = index.model()->index(0, 2, QModelIndex()); 
     cBox->addItem(index.model()->data(idx,Qt::UserRole).toStringList().at(0)); 
     cBox->addItem(index.model()->data(idx,Qt::UserRole).toStringList().at(1)); 
     cBox->addItem(index.model()->data(idx,Qt::UserRole).toStringList().at(2)); 
     } 
    cBox->setCurrentIndex(cBox->findText(value)); 
    } 

Le projet compile bien, mais quand je cliquez sur une cellule pour changer la valeur de QComboBox le programme chrashes et j'ai un "paramètre non valide passé à la fonction d'exécution C."

J'ai le sentiment d'une certaine manière que le problème est peut-être une erreur stupide, mais depuis que je suis aveugle et coincé ici pour un certain temps, je voudrais vraiment vous aider apprecciate sur ce ...

Pourriez-vous s'il vous plaît donner moi quelques conseils?

Merci d'avance pour la lecture !!!

Répondre

2

Mon problème était que j'essayais d'utiliser mymodel-> setdata() avant d'ajouter des lignes au modèle.

Donc, si au début je devrait faire:

QList< QStandardItem * > items; 
items.clear(); 
items << new QStandardItem("col0"); 
items << new QStandardItem("col1"); 
items << new QStandardItem("parrot"); 
items << new QStandardItem("col3"); 
mymodel->appendRow(items); 

et alors seulement ...

QModelIndex idx = mymodel->index(0, 2, QModelIndex()); 
mymodel->setData(idx,QVariant::fromValue(Pets), Qt::UserRole); 

Ceci a résolu la question.

Merci à tous.

Questions connexes