2017-12-16 2 views
0

왜 이것이 작동하지 않는지 궁금합니다.왜 QML ListView 대리인이 선택 변경 사항에 즉시 반응하지 않습니까?

ListView { 
    id: root 
    property var selection: QtObject {} 
    ... 
    delegate: MyView { 
     focused: ListView.isCurrentItem 
     selected: root.selection[index] === true 

     Rectangle { 
      id: selectionOverlay 
      anchors.fill: parent 
      color: "red" 
      opacity: 0.3 
      visible: selected 
     } 

    } 

    Keys.onPressed: if (event.key === Qt.Key_Space) { 
         if(!root.selection[root.currentIndex]) 
          root.selection[root.currentIndex] = true; 
         else 
          root.selection[root.currentIndex] = false; 
    } 
} 

즉, 대리인은 선택 개체의 변경 내용에 응답하지 않습니다. 인덱스에 대한 대리자를 다시 만들 때만 선택 항목을 볼 수 있습니다 (예 : 충분히 멀리 또는 뒤로 스크롤 할 때).

root.selection[index]에서 ListView.view.selection[index]으로 변경하는 것도 도움이되지 않습니다.

다중 선택 항목을 관리하려면 ListView 수준에서 선택해야합니다. 잠시 머리를 숙이고 있습니다.

감사합니다.

답변

1

selection의 하위 속성을 변경하면 selection 속성의 변경된 신호 자체가 방출되지 않습니다.

QML 바인딩 메커니즘은 속성 자체의 값이 변경된 경우에만 작동합니다. 그러나 귀하의 경우에는 selection 포인트가 절대로 변경되지 않으므로 selection의 하위 속성이 변경되면 알림을받을 수 없습니다.

해결 방법으로 전체 선택 개체를 다시 할당하거나 새로 고칠 수 있습니다. 하위 개체 속성이 변경되면이를 다시 적용 할 수 있습니다.

+0

마우스 클릭시 현재 색인을 업데이트하지만 문제는 마우스가 아닙니다. 스페이스 바를 누르면 콘솔에서 Listview의 selection 속성이 업데이트되었지만이를 반영하기 위해 대리자가 다시 그려지지 않습니다. –

+0

기본적으로 보이는 대리자에게 속성 바인딩을 확인하고 무언가가 변경되면 다시 그릴 수있는 방법이 필요합니다. –

+0

@AlexJenter 바인딩은 속성 값이 변경 될 때만 작동합니다. 귀하의 경우에는 변경되지 않습니다. –

관련 문제