2017-05-05 4 views
0

Qt는 QML and suggests three approaches in the docs와 C++ 모델을 결합 할 수있는 가능성을 제공합니다QML의 객체를 포함하는 QAbstractListModel의 단점은 무엇입니까?

  • QStringList
  • QObjectList
  • QAbstractItemModel

두 전직 사용하기 매우 간단합니다, 예를 QObjectList :

// in C++ 
QList<QObject*> dataList; 
dataList.append(new DataObject("Item 1", "red")); 

// in QML 
ListView { 
    model: dataList 
    delegate: Text { text: name } 
} 

하지만 그들은 모두 강력한 경고와 함께 :

참고 : 뷰가 QList의 내용이 변경되었음을 알 수있는 방법은 없습니다. QList 변경하면,

QAbstractItemModel는 오브젝트 속성 직접 이들을 동기화하는 따라서 노출되지 않기 때문에 오브젝트에 사용하는 것은 곤란하다 꽤 얻어 [...]를 모델을 재설정 할 필요 노력.

그러나 QAbstractItemModelQList을 랩핑하고 슈퍼 간단한 모델을 얻을 수 있습니다. 여기를 참조하십시오 : Implementation 1,


Implementation 2는 Qt는이를 기본적으로 구현하지 않는 이유가 있나요? 공연? 메모리 관리 문제? 그것은 명백하게 좋은 아이디어처럼 보입니다. ObjectModel을 사용하면 이미 비슷한 것을 구현합니다.

답변

2

모델 항목으로 QObject의 사용의 한 가지 단점은 기본 클래스가 꽤 크기 때문에 많은 것들을 포함하는 "신 오브젝트"(반 패턴)의 종류입니다. 당신은 정말로 대부분의 시간을 필요로하지 않습니다. 결과적으로, 모델 데이터 위에 160 바이트의 "오버 헤드"가 있습니다. 많은 항목이있는 큰 모델이 있고 항목 자체가 상대적으로 작 으면 문제가 될 수 있습니다. 당신은 많은 오버 헤드로 끝납니다.

QObjectList을 모델로 사용하는 것은 완전히 사소한 작업을 수행하지 않는 한 항상 잘못된 생각입니다. 참조 뷰 변경 사항을 알리는 적절한 인터페이스를 구현하지 않으므로 업데이트를 강제로 수행하면 변경 사항이 아닌 전체 모델이 다시 그려집니다.

모델을 올바르게 구현하면 어떤 항목 개체가 필요하지 않습니다.

이유에서 특히 유용의 두 번째 구현 :

    당신이 고정 된 각각의 역할과 모든 사용 시나리오
  • 으로 특정 "정적"모델을 구현하는 귀찮게 할 필요가 없습니다
  • 당신의 모델 항목은 모델 "스키마"에 국한되지 않습니다, 근본적으로 다른 특성을 가질 수
  • 하면 자동으로 얻을 당신이 QObjectQ_PROPERTY
  • y를 다루고 있기 때문에 QML에서 바인딩에 대한 알림 ou는 모델을 선언적으로 정의 할 수 있으며 심지어 모형을 중첩하여 트리 구조를 만들 수 있습니다. ListModel으로는 할 수 없습니다.
  • 당신은 신속한 프로토 타입 일명, 모든 시간을 재 컴파일 할 필요없이 순수 QML의 실제 모델 항목을 정의 할 수 있으며, 완료되면, 당신은 모든 위에, 포트 동시에 C++
  • 에 개체를 간단하게 할 수 장점은 모델이 실제 "고정"모델보다 구현 및 유지 관리가 훨씬 간단하다는 것인데, 본질적으로 하나의 object 역할을 갖고 조회가 전혀 없으므로 역할 조회가 빠르며 역할에 대한 데이터 변경 신호를 구현할 필요가 없습니다 등등 ... 쉬운 peasy
관련 문제