2013-11-28 5 views
1

QAbstractTableModel에서 서브 클래 싱되는 사용자가 동일한 데이터를 내 모델에 입력하지 못하게하려고합니다.QTableView :: edit (const QModelIndex & index)가 실패했습니다

bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role) 
{ 
    bool result = false; 
    ... 
    // Test if my model already has the same data 
    result = findItem(value.toString()) != -1; 
    ... 
    if (result) 
     emit(dataChanged(index, index); 
    else 
     emit (dataInvalid(index)); 

    return result; 
} 

지금은 신호를 잡아 다시 상태 편집에 (유형 QTableView인) 내 테이블보기를 설정해야합니다

void MyWindow::dataInvalid(const QModelIndex &index) 
{ 
    myTableView->edit(index); 
} 

를하지만 내 응용 프로그램을 실행할 때 콘솔에 메시지를 받았습니다 및 QTableView 편집 상태로 설정하지 않습니다

edit: edit failed 

을 내가 잘못 뭐하는 거지? 미리 감사드립니다.

+0

당신이보기에서 edit()를 호출 할 때 여전히 편집 모드이고 setData() 함수가 아직 종료되지 않았기 때문에 실패했다고 생각합니다. – vahancho

+0

대단히 감사합니다, @vahancho! 'dataInvalid' 시그널에 연결할 때'Qt :: QueuedConnection'을 추가하여 작동합니다! 문제는'QTableView :: edit (const QModelIndex & index)'를 호출했을 때'QTableView'가'QAbstractItemView :: EditState'에 ** 여전히 ** 있었기 때문입니다. 감사합니다. – pau

답변

1

myTableView->edit(index) 

내보기 를 호출 QAbstractItemView :: EditState 여전히하고 그 실패의 이유이다.

MyWindow::MyWindow() 
{ 
    ... 
    connect(myModel, SIGNAL(dataInvalid(QModelIndex)), 
     this, SLOT(dataInvalid(QModelIndex)), Qt::QueuedConnection); 
    ... 
} 

이제 모든 것이 잘 작동

: 솔루션은 신호에 연결할 때 Qt는 :: QueuedConnection를 추가하는 것입니다.