문제

인사말,

나는 내 모델에서 임의의 객체 세트의 삭제 실행 취소를 지원하기 위해 불쾌한 코드를 작성하고 있습니다. 다른 모든 돌연변이 체 (추가/복사 포지티기) 가이 기능의 하위 집합이기 때문에 나는 이것에 대해 올바르게하고 있다고 생각합니다.

코드는 나에게 필요한 것보다 더 나쁘다. 대부분 모델을 돌연변이하는 유일한 방법은 시작 인더 스트로우/시작을 호출하고 범위에서 행을 제거하는 것과 관련이 있기 때문이다 (한 번에 1 행을 수행하고 단일로 이웃을 최적화 할 필요가 없다. 아직 전화)

BeginInserTrows/BeginRemoverows의 문제점은 행을 제거하면 다른 QModelIndex (예 : 목록에 캐시 된)에 영향을 줄 수 있다는 것입니다. 예를 들어:

ParentObj
   ->ChildObj1
   ->ChildObj2
   ->ChildObj3

childobj1 및 childobj3을 선택하고 삭제한다고 가정합니다. childobj1을 먼저 제거하면 ChildObj3의 QmodelIndex를 변경했습니다 (이제 행이 다릅니다). 부모 객체를 삭제하면 비슷한 문제가 발생합니다 (그러나 객체 목록에서 어린이를 정리 하여이 문제를 해결했습니다).

이 인터페이스 제한을 중심으로 생각하는 방법은 다음과 같습니다. 그러나 앞서 나아 가기 전에 더 나은 것을 요구할 것이라고 생각했습니다.

  1. 제공된 QModelIndices 목록이 상단에서 아래로 주문되었다고 가정하면 "뒤로"이동하십시오. 이것은 실제로 신뢰할 수 있도록 정렬이 필요하며, 분류는 순진하고 느리게 아마도 아마도 순진하고 느릴 것입니다 (아마도 qmodelindexes 모음을 정렬하는 현명한 방법이 있습니까?

  2. 객체를 제거/추가 할 때마다 다른 QModelIndeces 업데이트 (Non-Saive 솔루션을 생각할 수없고 목록을 검색하고 필요한 경우 새 QModelIndeces를 얻으십시오).

  3. 실제 데이터를 업데이트하는 것은 쉽기 때문에 데이터를 업데이트하고 모델을 재건하십시오. 이것은 괴상한 것처럼 보이며, 큰 데이터 세트에서는 상당히 느려지는 것을 상상할 수 있습니다.

이것이 제가 현재 가지고있는 아이디어입니다. 나는 지금 옵션 1에서 일하고 있습니다.

안부, Dan O

도움이 되었습니까?

해결책

QABSTRANTITEMMODEL BASE 클래스에 뷰를 업데이트하는 방법 대신 지속적인 모델 인덱스를 수정하도록 요청하는 방법으로 BeginRemoverows/EndRemoverows 등을 생각하고 해당 인덱스 작업에서 QABSTRANTITEMMODEL BASE 클래스를 혼동하지 마십시오. 체크 아웃 http://labs.trolltech.com/page/projects/itemview/modeltest 모델을 운동하고 qabstractitemmodel 기본 클래스를 행복하게 유지하고 있는지 확인하십시오.

QPersistentModelIndex가 도움이되지 않는 경우, 실행 취소/레디 데이터를 모델 외부에 유지하려는 경우입니다. 나는 크게 편집 된 모델을 만들었고 모델의 모든 것을 유지하고 싶지 않았습니다. 실행 취소/레디 데이터를 실행 취소 스택에 저장합니다. 문제는 열을 편집하고 실행 취소에 해당 열의 영구 색인을 저장 한 다음 해당 열을 고정하는 행을 삭제하면 열의 영구 색인이 유효하지 않다는 것입니다.

내가하는 일은 지속적인 모델 지수와 "역사적"일반 QModelIndex를 유지하는 것입니다. 실행 취소/Redo가되면 영구 색인이 유효하지 않은지 확인합니다. 그렇다면, 역사상 QModelIndex를 내 모델의 특수 방법으로 전달하여 행, 열 및 내부 포인터를 기반으로 색인을 재현하도록 요청합니다. 모든 편집물이 실행 취소에 있으므로 실행 취소 스택에서 해당 열 편집으로 백업 할 때까지 행은 모델에있을 것입니다. 나는 원래 색인을 재현하기에 충분한 상태를 내부 포인터에 유지합니다.

다른 팁

데이터 모델과 함께 "All-Data"모델과 필터 프록시 모델을 사용하는 것을 고려합니다. 데이터는 All-Data 모델에만 추가되며 제거되지 않습니다. 이렇게하면 해당 모델에 대한 참조로 실행 취소/레디 정보를 저장할 수 있습니다. (제안해도 될까요? QPersistentModelIndex?). 데이터 모델도 어떻게 든 표시해야 할 사항을 추적 할 수 있습니다. 그런 다음 필터 모델은 주어진 시간에 표시되어야하는 항목에 대한 정보 만 반환합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top