2014-12-17 1 views
1

짧은 버전색인에서 항목에 색인이 이미 있는지 확인하는 이유는 무엇입니까? (Qt는)

트리 모델 index를 재 구현하는 경우, 왜 우리가 먼저하지 않는 경우는 루트 인덱스를 반환 관련 항목이 이미 (hasIndex로) 인덱스가 있는지 확인까요? 해당 항목의 색인을 만드는 것이 전체적인 요점이 아닙니까?

자세한 버전

는 PySide의 simpletreemodelindex의 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() 

답변

3

hasIndex 함수는 경계 검사를 수행한다. row 또는 column 인수가 0보다 작거나 parent 색인의 행 또는 열 수 범위를 벗어나면 False을 반환합니다. 그렇지 않으면 True을 반환합니다. 그것이 무효 인덱스 반환 (QModelIndex의 인수 없음의 생성자를 항상 잘못된 인덱스를 생성) 할 때 hasIndex false를 반환

은 또한, 구현 예에서, index 방법은 루트 인덱스를 반환하지 않습니다. 모델링되고있는 데이터로 대응하는 항목이없는 경우, 모델은 항상 무효 인 인덱스를 돌려 줄 필요가 있습니다.

+0

'hasIndex'에 대해 docs가 말한 내용에 대해 혼란 스러웠습니다 :''row'에 대해 유효한'QModelIndex'를 반환하고'parent'로'column'을 반환하면 true를 반환하고 그렇지 않으면 false를 반환합니다. " 이것은'isValid'와 같은 것으로 보입니다. Qt 소스 코드 (qabstractitemmodel.cpp)에서 어떻게 찾았습니까? – neuronet

+0

루트 인덱스 *가 유효하지 않은 인덱스 (즉, QtCore.QModelIndex())라고 생각했습니다. 예를 들어, Summerfield (Rapid Gui Programming)는 "나무 모델에서 모든 항목은 다른 항목의 하위 항목이므로 상위 항목이 * 상위 수준 (루트) 항목입니다. 이 경우, 부모는 존재하지 않으므로 잘못된 모델 색인으로 표시됩니다. * 따라서'QModelIndex()'(즉, 유효하지 않은 모델 색인이있는)로'columnCount() '를 호출하면 우리는 최상위 항목의 열 개수 "(p495, 강조 추가됨). – neuronet

+2

@neuronet. Qt 문서는 특별히 명확한 것은 아니지만'hasIndex'가 일종의 경계 검사를하는 것이 맞습니다. 소스 코드를 읽으면 가정이 올바른지 항상 확인할 가치가 있습니다. 루트 인덱스의 경우 : 모든 잘못된 인덱스와 마찬가지로 데이터의 항목을 나타내지 않으므로 유효하지 않습니다. – ekhumoro

관련 문제