2017-09-21 1 views
0

나는 listView 버튼이 있습니다. 단추 정의는 자체 qml 파일에 있으며 대리자로 사용됩니다. QML : 목록보기에서 델리게이트 상태를 저장하는 방법

delegate: ProgramButton { 
    state: stateFromModel 
} 

나는 나의 listModel의 속성을 통해 설정해야합니다 버튼에 대한 상태를 정의했다. 이 기능은 처음에는 작동하지만 스크롤하는 동안 버튼이 보이지 않게되고 나중에 스크롤하면 상태가 잊어 버린 것처럼 보입니다.

문제는 Qt 문서에서 말하듯이 the states should never be saved in delegates입니다.

그러나 listView 속성을 통해 버튼의 상태를 설정하는 올바른 방법은 무엇입니까?

답변

0

문서는 지금 시점에서입니다. 적어도 볼 수있는 대리자 만 인스턴스화하는 뷰에 대해서는.

그래서 해결책은 분명합니다. 은 대리인에 저장하지 않습니다. -하지만 어디에서 저장할 수 있습니까?

모델의 초기 상태를 유지하지 않으려면 모델이 가장 쉬운 장소가됩니다. 이 경우 stateChange 신호를 수신하고 새 상태를 모델에 다시 써야합니다.
모델에서 직접 상태를 변경하십시오. state -> model.stateFromModel 바인딩으로 인해 버튼에 자동으로 변경 사항이 적용됩니다.

그렇게 할 수없는 경우 상태를 저장하기 위해 영구 객체를 만들어야합니다. 이것은 JSObject (일명 var : ({}) 일명지도) 또는 ListView의 각 항목에 대해 Instantiator으로 QObject을 인스턴스화하고 에 따라 데이터를 저장하고 myInstantiator.objectAt(index)을 사용하여 해당 개체를 검색 할 수 있습니다.

자발적으로 내 마음에 오는 마지막 방법은,이 같은 DelegateModel을 사용하고 있습니다 :

DelegateModel { 
    id: dm 
    model: myOriginalModel 
    delegate: ProgrammButton { 
     state: stateFromModel 
     onStateChanged: DelegateModel.inPersistedItems = 1 
    } 
} 

뷰를 떠날 때 파괴되는 것을 방지하는 특수 그룹 persistedItems에 stateChange 오브젝트에 대리자를 추가 .

마지막으로 ListView의 모델에 DelegateModel을 사용하고 delegate을 설정하지 마십시오.

관련 문제