짧은 버전색인에서 항목에 색인이 이미 있는지 확인하는 이유는 무엇입니까? (Qt는)
트리 모델 index
를 재 구현하는 경우, 왜 우리가 먼저하지 않는 경우는 루트 인덱스를 반환 관련 항목이 이미 (hasIndex
로) 인덱스가 있는지 확인까요? 해당 항목의 색인을 만드는 것이 전체적인 요점이 아닙니까?
자세한 버전
는 PySide의 simpletreemodel 예 index
의 reimplemention을 (전체 코드는 다음과 같습니다) 고려하십시오. 내 이해는 index
메서드는 특정 항목의 행, 열 및 부모 인덱스를 가져와 createIndex
을 사용하여 해당 항목에 대한 인덱스를 반환하기위한 것입니다. 그러나 index
방법은 다음과 같은 라인 열립니다
if not self.hasIndex(row, column, parent):
return QtCore.QModelIndex()
내가 여기에 조금 혼란 스러워요. 항목에 에 이미 유효한 인덱스가 없으면 루트 인덱스를 반환하는 이유는 무엇입니까? 이 방법은 처음에 어떻게 인덱스를 생성합니까? 위의 줄을 자르면 응용 프로그램에 해로운 영향을주지 않습니다.
가능한 한 PySide 예제를 단순화하려고하기 때문에이 두 행을 제거하고 싶습니다. 이것은 예기치 못한 결과를 초래할 수 있습니까?
관련 코드는
def index(self, row, column, parent):
if not self.hasIndex(row, column, parent):
return QtCore.QModelIndex()
if not parent.isValid():
parentItem = self.rootItem
else:
parentItem = parent.internalPointer()
childItem = parentItem.child(row)
if childItem:
return self.createIndex(row, column, childItem)
else:
return QtCore.QModelIndex()
'hasIndex'에 대해 docs가 말한 내용에 대해 혼란 스러웠습니다 :''row'에 대해 유효한'QModelIndex'를 반환하고'parent'로'column'을 반환하면 true를 반환하고 그렇지 않으면 false를 반환합니다. " 이것은'isValid'와 같은 것으로 보입니다. Qt 소스 코드 (qabstractitemmodel.cpp)에서 어떻게 찾았습니까? – neuronet
루트 인덱스 *가 유효하지 않은 인덱스 (즉, QtCore.QModelIndex())라고 생각했습니다. 예를 들어, Summerfield (Rapid Gui Programming)는 "나무 모델에서 모든 항목은 다른 항목의 하위 항목이므로 상위 항목이 * 상위 수준 (루트) 항목입니다. 이 경우, 부모는 존재하지 않으므로 잘못된 모델 색인으로 표시됩니다. * 따라서'QModelIndex()'(즉, 유효하지 않은 모델 색인이있는)로'columnCount() '를 호출하면 우리는 최상위 항목의 열 개수 "(p495, 강조 추가됨). – neuronet
@neuronet. Qt 문서는 특별히 명확한 것은 아니지만'hasIndex'가 일종의 경계 검사를하는 것이 맞습니다. 소스 코드를 읽으면 가정이 올바른지 항상 확인할 가치가 있습니다. 루트 인덱스의 경우 : 모든 잘못된 인덱스와 마찬가지로 데이터의 항목을 나타내지 않으므로 유효하지 않습니다. – ekhumoro