2012-03-16 16 views
0

Мне нужно реализовать таблицу в Qt, которая показывает QComboBox для каждой строки в конкретном столбце.Qt, QStandarItemModel: Элементы делегирования пользовательского QComboBox, заполняющего его содержимое с помощью программы-исполнителя.

На основании этого вопроса: QStandardItem + QComboBox Мне удалось создать QItemDelegate. В этом примере содержимое QComboBox определено статически на классе ComboBoxDelegate, но в моем случае мне нужно определить содержимое QComboBox внутри функции, в которой создается QStandardItemModel.

модель определяется внутри метода класса 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); 
    } 

Тогда я должен быть в состоянии восстановить содержимое ComboBox из класса делегата:

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

Проект компилирует хорошо, но когда я нажмите на ячейку, чтобы изменить значение QComboBox в программах, и я получил «Недопустимый параметр, переданный функции времени выполнения C».

У меня есть ощущение, как-то, что проблема может быть, глупая ошибка, но так как я слепой и застрял здесь довольно долго, я бы действительно apprecciate вы помочь в этом ...

Не могли бы вы дать мне совет?

Заранее благодарим за чтение !!!

ответ

2

Проблема была в том, что я пытался использовать mymodel-> setdata(), прежде чем добавлять строки в модель.

Так что если сначала я должен сделать:

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

и только потом ...

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

Это решило проблему.

Спасибо всем.