2011-09-27 4 views
4

QAbstractItemModel에서 파생 된 작업 트리 모델이 있고 QSortFilterProxyModel 하위 클래스를 사용하여 필터를 적용하여 특정 조건의 자식 노드 만 표시하려고합니다. 예를 들어, 나는 다음과 같은 트리가 : 나는 노드가 이름을 가지고있는 조건이 나무를 필터링 할QSortFilterProxyModel을 사용하여 자식 노드 만 부모와 함께 표시하는 트리 모델을 필터링하는 방법?

A 
- B 
-- C1 
-- C1 
-- C1 
--- C2 
- D 
- E 

을 ==이 같은 C1과 그들의 아이들과 C1 및 디스플레이 노드 만 :

C1 
C1 
C1 
- C2 

A 
- B 
-- C1 
-- C1 
-- C1 
--- C2 

내 생각이 나 있습니다 :

이미 재 구현 부분적으로 내가 원하는하지만 여전히 C1 노드의 부모와 조부모가 표시됩니다 무엇을 할 수 filterAcceptsRow()와 서브 클래스가 부모 노드가 filterAcceptsRow() 테스트를 통과해야합니다. 그렇습니까? filterAcceptRows() 또는 다른 메서드를 구현하여이를 설명 할 수 있습니까?

나는이 질문을 qtcentre와 qtforum에서 언젠가 되돌려 보았지만 어떤 유용한 대답도 얻지 못했습니다. QSortFilterProxyModel 서브 클래스의 인덱스를 filterAcceptsRow() 내부에서 beginMoveRows 및 endMoveRows를 사용하여 직접 이동하려고 시도했지만 위험한 const_cast로 인해 테스트 응용 프로그램이 충돌합니다.

+0

와우 같은 사용자 정의 프록시 모델을 사용하여 고려할 수 있습니다! 정말 아무도 이것에 대답 할 수 있습니까? – ksming

답변

4

그래, 내 문제에 대한 해결책을 찾았습니다. 인덱스 B와 함께 QTreeView :: setRootIndex()를 입력 인수로 사용하십시오. 인덱스 B는 숨겨진 QTreeView의 루트 인덱스가되며 해당 자식 만 전체로 표시됩니다.

이 솔루션을 찾은 후에 나는 정말 멍청했습니다. 데이터를 표시하는 방법을 수정하기 위해 프록시 모델을 사용하는 데 너무 집중했다면 QTreeView에 대해 완전히 잊어 버렸습니다. 물론 setRootIndex의

1

QSortFilterProxyModel을 사용하여이 작업을 수행 할 수 없다고 생각합니다. 그 이유는이 클래스가 요소를 필터링하기 때문입니다. 즉, 특정 조건을 기반으로 일부 요소를 숨기거나 숨 깁니다. 당신이하고 싶은 것은 나무를 새로운 것으로 재구성하는 것입니다 (루트 자식에서 임의의 위치에서 요소를 선택했습니다). 이는 독자적인 QProxyModel 자손을 작성하고 트리 재 빌드를 구현하고 이전 트리와 새 트리 사이에 인덱스를 맵핑하는 경우에만 가능합니다.

정확하게 설명하는 방법은 여기에 대한 답변이 조금 있습니다.

+0

QSortFilterProxyModel로 주변을 둘러 본 후에, 나는 당신이 옳다고 생각합니다. 부적절한 부모 노드를 표시하지 않으려면 내 자신의 QProxyModel을 만드는 것이 너무 번거로운 것 같습니다. 지금 부모 노드를 가지고 살 것이며 treeview :: expandAll()을 호출하여 모델을 다시로드하여 모든 데이터가 즉시 표시되도록 할 것입니다. – ksming

관련 문제