2017-01-31 3 views
0

ListModel 내부의 데이터가 변경 될 때 일부 작업을 수행하기 위해 QML ListModel에 콜백 함수를 구현하려고합니다. 분명히 위에 만들 수는 없습니다 ... ListModel의 개별 사용자 정의 속성에 대한 핸들러가 변경되었습니다. 그래서, ListModel에 사용할 수있는 onDataChanged 핸들러를 사용하려고합니다.QML ListModel onDataChanged 문제

ListModel { 
    id: model 

    onDataChanged: { 
     console.warn("onDataChanged: "+get(topLeft).val + " vs. " + get(bottomRight).val) 
    } 
} 

그러나 onDataChanged는 ListModel의 첫 번째 요소 만 참조하는 것 같습니다. 즉, 목록 아래로 요소를 조작하는 경우에도 topLeft 및 bottomRight는 항상 첫 번째 요소를 가리 킵니다.

여기서 내가 필요한 것은 ListModel의 올바른 행을 정확하게 반영하는 신뢰할 수있는 핸들러입니다.

+0

[일반 개체 모델] (http://stackoverflow.com/questions/35160909/how-to-create-a-generic-object-model-for-use-in-qml/35161903#35161903)을 사용하는 경우 그런 다음 개별 변경 알림과 함께 일반 속성을 사용할 수 있습니다. – dtech

+0

프로젝트의 제약으로 인해 불가능합니다. 왜 다른 행을 조작 할 때 onDataChanged가 맨 처음 행을 반환합니까? 이 매개 변수를 잘못 사용하고 있습니까? – user1765354

+0

'QAbstractItemModel :: dataChanged()'의 인수는'QModelIndex', 즉 클래스 유형의 객체입니다. 이것을 정수를 필요로하는 함수에 전달하는 경우 JavaScript 환경은 마술 유형 변환 중 하나를 수행 할 가능성이 높습니다. 변경 사항이 이상한 데이터에 ListModel을 사용하면 대개 적절한 사용자 지정 모델이 더 좋음을 나타냅니다. –

답변

0

내가 데이터를 변경하면 ListModel 모든 것이 옳은 것처럼 보입니다. 예를보십시오

Window { 
    id: mainWindow 
    visible: true 
    width: 1200 
    height: 800 

    ListModel { 
     id: lm 
     ListElement { test: 0 } 
     ListElement { test: 0 } 
     ListElement { test: 0 } 
     ListElement { test: 0 } 
     ListElement { test: 0 } 

     onDataChanged: console.log('Data Changed', topLeft.row, get(topLeft.row).test, data(topLeft, roles[0])) 
    } 

    ListView { 
     width: 200 
     height: 800 
     model: lm 
     delegate: Button { 
      text: model.test 
      onClicked: model.test++ 
     } 
    } 
} 

QML- get α- 함수는 QModelIndex.row에 해당하는 인덱스를 나타내는 정수를 기대한다. QML에서는 행을 속성으로 표시하므로 .row()은 실패합니다.

대안으로 사용할 수있는 것은 data(index, role)입니다. 이것은 인덱스로 QModelIndex을 취하고 role을 정수로 취합니다. 행운이다. 해커가 아닌 QML에서 일반적으로 사용되는 roleName에 신호가 제공하는 정수 유형 역할에서 매핑을 다시 얻는 방법을 알고 있기 때문에 다행이다.