2012-03-16 18 views
0

我需要在Qt中實現一個表,在特定列的每一行上顯示一個QComboBox。Qt,QStandarItemModel:自定義QComboBox上的委託項目,從模型的實例化器中填充它的內容。

基於這個問題:QStandardItem + QComboBox我成功地設法創建了一個QItemDelegate。在那個例子中,QComboBox的內容是在ComboBoxDelegate類上靜態定義的,但在我的情況下,我需要在創建QStandardItemModel的函數中定義QComboBox的內容。

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

然後,我應該能夠從委託類收回組合框的內容:

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

該項目編譯好,但是我

該模型是一個MainWindow類方法中定義點擊一個單元格來改變程序崩潰的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); 

這解決了這個問題。

謝謝大家。

相關問題