2013-06-05 4 views
0

SelectItems 동작을 사용하는 ExtendedSelection 모드에서 QTableView를 사용합니다.
다음 동작을 구현하고 싶습니다.
1) 하나의 셀만 선택하면 아무 작업도하지 마십시오.
2) 두 개 이상의 셀을 선택한 경우 - 선택한 셀마다 전체 행을 선택하십시오.QTableView, ExtendedSelection 모드에서 조건부 행 선택

void BaseTableView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) 
{ 
    QTableView::selectionChanged(selected, deselected); 
    QItemSelection currentSelection = selectionModel()->selection(); 

    //table has selection 
    if(!currentSelection.isEmpty()) 
    { 
     QItemSelectionRange selectionRange = currentSelection.first(); 

     //select whole row if more than one cell is selected 
     if(currentSelection.count() > 1 || selectionRange.height() > 1 || selectionRange.width() > 1) 
     { 
      if(!deselected.isEmpty()) 
       selectionModel()->select(deselected, QItemSelectionModel::Deselect | QItemSelectionModel::Rows); 
      if(!selected.isEmpty()) 
       selectionModel()->select(currentSelection, QItemSelectionModel::Select | QItemSelectionModel::Rows); 
     } 
    } 
} 

이 코드는 어떻게 든 작동 : 여기

은 예입니다. 그러나 나는 더 나은 해결책을 찾을 수 없다.
문제 :
1) 마우스를 사용할 때 선택 영역이 깜박입니다. 이중 전화 selectionChanged 또는 이와 비슷한 것 때문일 것입니다.
2) Shift 키를 사용한 선택이 제대로 작동하지 않습니다. Shift 키를 누른 상태에서 선택 영역을 변경하면 deselected은 항상 비어 있습니다. 따라서 선택은 항상 증가합니다.

설명 된 동작을 구현하기위한 더 나은 솔루션은 무엇입니까?
Shift 키를 눌러 선택을 수정하는 방법은 무엇입니까?

답변

0

다른 해결책을 찾았습니다.

QItemSelectionModelselect() 방법을 다시 구현했습니다. 약간의 점검을하고 초기 플래그에 Rows 플래그를 추가하는 것으로 충분합니다.