2013-06-09 7 views
0

QTreeView에서 자식이있는 행을 삭제하려고합니다. QAbstractItemModelremoveRow (int row, const QModelIndex & parent = QModelIndex()) 메서드를 사용하여 삭제 된 행의 행과 부모 인덱스를 전달합니다. 그러나이 메서드는 false를 반환합니다.QTreeView에서 자식이있는 행을 삭제하는 중

어떻게 어린이가있는 행을 삭제할 수 있습니까? 재귀 적으로 행을 삭제하는 메소드를 작성해야합니까?

+1

QAbstractItemModel의 removeRow 메서드가 구현 되었습니까? – CrystalJake

+0

자신의 모델 클래스 또는 표준 Qt 클래스 중 하나를 사용합니까? 어느 것? –

+0

removeRow가 removeRows()의 모델 구현에 의존하는 경우. 기본 impl은 아무 것도하지 않고 false를 반환합니다. –

답변

0

이 보라 : removeRow

이 removeRows를 호출하는 편리한 함수()입니다. removeRows() 의 QAbstractItemModel 구현은 아무 것도 수행하지 않습니다..

그리고 여기 QAbstractItemModel::removeRows()

:

기본 클래스 구현은 아무것도하지 않고 false를 돌려줍니다.

자신의 모델을 구현하는 경우 제거를 지원하려면이 함수를 다시 구현할 수 있습니다. 또는 데이터를 변경하기 위해 자체 API를 제공 할 수도 있습니다.

0

나는 파티에 좀 늦다는 것을 알고 있지만 원래 질문에 대한 좋은 대답을 찾을 수 없어서 문서화하고 싶었습니다.

  1. 모델에 QAbstractItemModel::removeRows을 구현해야합니다. Qt 예제 인 편집 가능한 트리 모델이 있는데 어떻게 수행해야하는지 보여줍니다. 기본 절차는 beginRemoveRows으로 전화하고 항목을 삭제 한 다음 endRemoveRows으로 전화하는 것입니다.
  2. 트리 항목 클래스에는 해당 하위 항목의 범위를 삭제하는 메소드가 있어야합니다. 재 구현시 removeRows에서 상위 항목에 대해이 메소드를 호출합니다. 트리 항목 클래스는 파괴 될 때 자식을 삭제하도록 설정되어야합니다. Qt 예제는 소멸자를 통해 이것을 수행하지만, C++ 11 이상에서는 자식을 스마트 포인터의 컨테이너에 저장하여 컨테이너가 범위를 벗어날 때 자동으로 삭제되도록하는 것이 가장 좋습니다.
  3. 아니요은 하위 항목이 축소되어 표시되거나 트리보기에서 확장되어야 할 필요가 있음을 나타냅니다. QTreeView은 하위 항목이 표시되는지 여부를 알고 적절하게보기를 업데이트합니다. 즉, 트리 뷰에 표시되는 하위 항목이 몇 개있는 트리 항목을 삭제하면보기에서 자동으로 제거됩니다. 이것은 어디서나 문서화 할 수없는 것이지만, 개인적인 경험을 통해 beginRemoveRowsendRemoveRows이라고 정확히 부르는 한 제대로 작동한다고 말할 수 있습니다.
관련 문제