2016-09-15 4 views
2

qml에 트리 뷰가 있는데, 선택 모드는 ExtendedSelection입니다. 선택한 인덱스가 사용자에 의해 변경 될 때마다 어떤 트리 행이 선택되었는지 정확히 알 필요가 있습니다. 여기에 TreeView가 있습니다 :QSM의 selectedRows() ExtendedSelection이있는 TreeView는 한 걸음 뒤에 있습니다.

Controls.TreeView { 
      id: myTreeView 
      Controls.TableViewColumn { 
        title: "Name" 
        role: "name" 
      } 

      headerVisible: false 
      anchors.fill: parent 
      selection: ItemSelectionModel { 
       onCurrentIndexChanged: { 
        console.log(myTreeView.selection.selectedRows(0)) 
        console.log(currentIndex) 
       } 
      } 

      selectionMode: Controls.SelectionMode.ExtendedSelection 
      onDoubleClicked: { 
       if (isExpanded(index)) 
        collapse(index); 
       else 
        expand(index); 
       } 

    } 

위 예제에서 선택한 행을 콘솔에 인쇄하여 올바르게 선택했는지 확인해보십시오. currentIndex은 항상 마지막으로 선택한 색인을 보유하지만 (예상대로) 현재 선택된 모든 행을 보유하기로되어있는 selection.selectedRows()은 항상 한 발 앞선 것입니다. 예를 들면 :는

경우 사용자 (Ctrl 키 채하는) 행 하나 1, 2, 3 하나 selection.selectedRows()null, "1", "1,2"되며 currentIndex 각각 1, 2, 3 될 것을 선택한다. 이 두 가지를 결합하여 선택된 상태에있는 모든 인덱스의 목록을 가져올 수 있습니다. 내 문제는 사용자가 Ctrl 키를 놓고 행 4을 선택하면 null 이어도 selection.selectedRows()"1,2,3"이됩니다. 요약하면 사용자가 (Ctrl 키를 누른 상태에서) 행 1,2,3,4을 선택한 경우와 Ctrl 키를 누른 상태에서 처음으로 행을 선택하고 Ctrl 키를 놓고 행 4을 선택하는 경우를 구별 할 수 없습니다.

나는 또한 myTreeView.selection.selectedIndexes으로 테스트했지만, 여전히 동일한 동작입니다. TreeView의 버그처럼 보입니다. 해결 방법에 대한 조언을 부탁드립니다.

감사합니다.

답변

0

onCurrentIndexChanged 대신 onSelectionChanged을 사용해야합니다. 그 신호로 당신은 선택된 인덱스 목록을 얻을 수 있습니다.

전체 코드를 모르지만 Qt에서 제공 한 File System Browser 예제를 사용하면 차이점을 확인할 수 있습니다. 이 예에서

어떻게 두 신호가 작동하는지 확인하기

ItemSelectionModel { 
    id: sel 
    model: fileSystemModel 
    onSelectionChanged: { 
     console.log("onSelectionChanged - selectedRows: " + selectedIndexes) 
    } 
    onCurrentIndexChanged: { 
     console.log("onCurrentIndexChanged - selectedRows: " + selectedIndexes) 
    } 
} 

의해

ItemSelectionModel { 
    id: sel 
    model: fileSystemModel 
} 

대체.