2011-11-24 8 views
4

QStandardItemModel로 채워진 QTableView가 있습니다.
네트워크를 통해 모델을 자주 업데이트하고 모델은 QTableView를 통해 직접 사용자가 업데이트합니다.QTableView, QStandardItemModel 및 신호

는 지금은 사용자가 어떤 데이터를 변경하는 메소드를 호출 좋아, 그래서 내가 그랬어 :

connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(dataChanged(QStandardItem*))); 

지금, 내 dataChanged 메소드가 호출되는 것을, 또한 항목이으로 업데이트되는 문제 회로망.

model->setData(index, new_val); 

사용자가 tableview에서 무언가를 변경하는 경우에만 다른 신호가 방출됩니까 ???

답변

3

아니요, AFAIK에는 그러한 신호가 없지만 해킹 할 수있는 방법이 있습니다.

QTableView에서 항목을 편집 할 때 activated 신호가 방출되었습니다. 아이디어는이 신호를 잡아서 마지막으로 수동으로 변경된 항목을 저장할 슬롯에 연결하는 것입니다.

connect(view, SIGNAL(activated(QModelIndex), this, SLOT(manuallyActivated(QModelIndex))); 

void manuallyActivated(QModelIndex index) 
{ 
    // This variable should be in your header file... 
    lastManuallyModifiedIndex = index; 
} 

이제 단순히 변경 항목이 마지막으로 수정 된 항목에 해당하는지 확인하기 위해 dataChanged 슬롯을 수정합니다.

void dataChanged(QStandardItem* item) 
{ 
    // If it is invalid simply ignore it... 
    if (lastManuallyModifiedIndex.isValid() == false) 
     return; 

    // only if it is modified manually we process it 
    if (item->index() == lastManuallyModifiedIndex) 
    { 
     // make last modified index invalid 
     lastManuallyModifiedIndex = QModelIndex(); 
     doSomething(); 
    } 
} 
+0

mhm은 내 문제에 대한 좋은 해결 방법입니다. 그것을 테스트 한 후, 활성화 된 신호가 항목을 선택하고 입력을 히트 한 후 인라인 편집으로 표시되지 않는 것처럼 보입니다. – nfo

+0

정확한 soloution, 심지어 활성화 신호가 내 경우에 방출되지 않기 때문에 나는 답변을 유지할 것입니다. 솔기가 플랫폼에 종속적 인 것처럼 보입니다.) 이제 입력 된 신호를 사용하고 mousetracking을 활성화했습니다. 최선의 해결책은 아닐지 모르지만, 내 필요에 맞습니다. – nfo

1

네트워크에서 업데이트가 들어올 때 테이블 신호를 차단할 수 있습니다.

QObject::blockSignals(bool block) 

또는 연속해서 이벤트를 클릭하고 편집 할 수 있습니다.