2014-02-11 3 views
2

QAbstractItemModel을 사용하여 트리 모델 (최대 몇 개의 추적 된 항목까지)을 나타냅니다. 데이터 그 자체는 동적입니다. 노드가 나타나거나 사라질 때마다 값 (또는 다른 역할)이 변경 될 수 있습니다.동적 트리 모델 (Qt)

모델을 변경하는 것은 쉽습니다. QTreeView에 변경 사항을 알리기 위해 신호를 효율적으로 내보내는 방법이 궁금합니다 (대부분 노드가 축소됨).

동시에 여러 변경이 동시에 발생할 수 있습니다 (행 삽입 및/또는 삭제). 사용

  1. beginInsertRows/endInsertRows/beginRemoveRows/endRemoveRows -이 다수의 변경도 통보하는 방법 안된다?
  2. 성능면에서 가장 좋은 전략은 무엇입니까? 예를 들어, 나뭇잎에서 시작하여 각 노드에 대해 루트/~ 아래로 가기 (맨 위부터 botton까지)/삽입 전에 삭제/
  3. beginResetModel/endResetModel은 반드시 덜 효율적입니까?
  4. QStandardItemModel을 사용하면 어떤 이점이 있습니까? (이 특별한 경우).

답변

3
  1. 예. disjoint 제거/추가의 모든 사람에게 알리는 방법은 여러 신호를 내 보냅니다. 대부분의 경우 부모 인덱스와 행/열 인덱스를 구분하는 대신 복잡한 데이터 구조를 전달하는 데 더 많은 오버 헤드가 발생합니다.

  2. 항목의 제거/추가에 대해서만 알려야 루트가 닫힙니다. 부모가 이후에 없어지면 자녀를 퇴거시키는 것에 대해 알리는 것은 의미가 없습니다. 부모에 대한 통지는 아이들이 분명히 더 이상 존재하지 않는다는 것을 의미합니다.

  3. 효율성뿐 아니라 상태에 대해서도 그렇습니다. 모델 재설정은 뷰 상태를 재설정합니다. 리셋을 받으면 뷰는 전혀 새로운 모델이 아니라고 추측 할 수 없으므로 선택 항목, 확장/축소 상태 등을 잃을 수 있습니다. 뷰가 다른 방식으로 동작 할 수있는 방법은 없습니다. 다시 놓기. 그렇지 않으면 모델 컨텐츠의 자체 복사본을 유지하기위한 뷰가 필요합니다.

    모델 리셋은 모든 항목의 재 레이아웃을 의미하므로 매우 비싼 작업 일 수 있습니다. 전체적으로 원래 항목의 50 % 이상이 변경 (제거/제거) 될 경우에만 수행해야합니다. 대체/추가).

  4. 아니요, 이점이 없으며 데이터를 변형으로 저장하지 않으면 QStandardItemModel을 사용하면 항상 더 큰 메모리 오버 헤드가 발생합니다. 그것이 당신의 요구에 정확하게 부합한다면 그것은 의미있는 편의 클래스입니다. 사실, 당신이 그것을 어떻게 사용하는지 조심하지 않으면, 그것은 더 나빠질 것입니다.

    예를 들어, 먼저 깊이 반복하여 항목을 제거하고 가장 먼 어린이를 먼저 제거하면 QStandardItemModel은 미래를 예견 할 수 없습니다. 즉, 모든 어린이의 공통 조상을 정말로 제거하고 싶다는 것입니다. 불필요하게 많은 변경 이벤트를 방출합니다. 자신의 모델에서 제대로 처리 할 수 ​​있습니다. 또는 자녀를 만지지 않고도 일반 부모를 제거하면 암시 적으로 제거되므로 쉽게 제거 할 수 있습니다.