2012-03-16 8 views
0

특정 열의 각 행에 QComboBox를 보여주는 Qt의 테이블을 구현해야합니다.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); 

을이 문제를 해결했다.

감사합니다.