2014-12-16 1 views
3

는 :QML ListView에서 현재 요소 인덱스를 가져 오는 방법은 무엇입니까? 예를 들어

import QtQuick 2.4 
import QtQuick.Controls 1.3 
import QtQuick.Window 2.2 
import QtQuick.Dialogs 1.2 

ApplicationWindow { 
    width: 250 
    height: 250 
    visible: true 

    Rectangle { 
     anchors.fill: parent 

     ListModel { 
      id: colorsModel 
      ListElement { colorCode: "red" } 
      ListElement { colorCode: "green" } 
      ListElement { colorCode: "blue" } 
      ListElement { colorCode: "orange"} 
     } 

     ListView { 
      anchors.fill: parent 
      snapMode: ListView.SnapOneItem 
      model: colorsModel 

      delegate: Rectangle { 
       width: 250 
       height: 250 
       color: colorCode 
      } 

      onMovementEnded: { 
       console.log($CurrentElementIndex$) 
      } 
     } 
    } 
} 

어떻게 $ CurrentElementIndex $ 자리에 현재 요소의 인덱스를받을 수 있나요?

ListView.currentIndex는 제대로 이해하는 것처럼 쓰기 속성입니다.

아마도 ListView.indexAt()를 사용할 수는 있지만 어떻게 작동하는지 이해할 수 없습니다.

+1

변수 만 쓰면 무엇을 의미합니까? – lpapp

+0

console.log (currentIndex)는 항상 "qml : 0"을 인쇄합니다. 그러나 "currentIndex = N"은 N 항목에서보기를 전환했습니다. ("변수"가 아닌 "속성", 죄송합니다.) – knkd

답변

2

onMovementEnded()은 목록 스크롤이 완료되면 호출됩니다. 이는 항목 선택과 무관합니다. 현재 선택 요소 디버그에 형광펜을 추가하고 onCurrentIndexChanged 핸들러 사용할 수 있습니다

ListView { 
    anchors.fill: parent 
    snapMode: ListView.SnapOneItem 
    model: colorsModel 

    delegate: Rectangle { 
     width: 250 
     height: 250 
     color: colorCode 
    } 

    highlight: Rectangle { 
     anchors.fill: parent 
     color: "red" 
    } 

    onCurrentIndexChanged: console.log(currentIndex) 

    // ... 
+0

아니요. 스크롤하는 동안 새 색인을 가져 오려고합니다. – knkd

+0

그런 다음'indexAt (3,3)'을 사용하면 ListView의 왼쪽 상단 모서리에서'x : 3px','y : 3px' 위치에있는 요소의 색인을 가져옵니다. 스크롤하는 동안 항상 첫 번째 요소 여야합니다. –

+0

'onMovementEnded : console.log (view.indexAt (3, 3))'print'qml : 0 | qml : 0 | qml : 0 | qml : -1 | qml : -1 | ... '. 하지만 나는'qml : 0 | qml : 1 | qml : 2 | ... ' – knkd

1

당신은 currentIndex 얻을 현재 선택한 항목을 설정하는 데 사용할 수 있습니다. 는하지만 당신은 말했다 :

내가 그것을

그래서 당신은 당신의 ListView에 highlightRangeMode: ListView.StrictlyEnforceRange을 설정해야 스크롤하는 동안 새 인덱스를 얻을합니다. 목록을 스크롤 할 때마다이 속성이 currentIndex으로 변경됩니다.

ListView { 
    id: list 
    anchors.fill: parent 
    model: 10 
    orientation: ListView.Vertical 
    snapMode: ListView.SnapOneItem 
    highlightRangeMode: ListView.StrictlyEnforceRange  //<--This is the key note 
    header: Component { Item { width: 1; height: 30 } } 
    footer: Component { Item { width: 1; height: 30 } } 
    preferredHighlightBegin: height/2-10 //<-----using these two lines you can control position of the selected item 
    preferredHighlightEnd: height/2-10  //<--| 
    currentIndex: 3 
    onCurrentIndexChanged: { 
     console.log("current selected index is: "+currentIndex); //<-- Test output 
    } 

    delegate: Component { 
     Text { 
      id: _root 
      width: parent.width 
      height: 20 
      horizontalAlignment: Text.AlignHCenter 
      color: "#888" 
      font { family: "Segoe UI Light"; pixelSize: 18 } 
      text: index 
     } 
    } 
} 

이 더 많은 정보 Qt는 참고 자료 문서를 참조하십시오
다음은 몇 가지 예입니다.

관련 문제