2011-10-04 8 views
0

PyQt 예제에서 editabletreemode.py를 기반으로하는 QTreeView GUI가 있습니다. 모델 내부, 나는 내 필요에 대한 사항 setData()를 다시 구현 : 일부는 내가 false를 반환하고있어 아웃 오브 바운드 값, 그렇지 않으면qtreeview 데이터 불일치

def setData(self, index, value, role=QtCore.Qt.EditRole): 
    if role != QtCore.Qt.EditRole: 
     return False 

    item = self.getItem(index) 
    result = item.setData(index.column(), value) 

    if result: 
     self.dataChanged.emit(index, index) 
     self.modified = True 

    print "setData() returning ", result 
    return result 

문제는 사항 setData가 반환하는 경우에도입니다 True를 반환을위한 거짓, GUI는 여전히 변경된 값을 승인합니다. 그래서 모델과 뷰 사이에 일관성없는 데이터가 있습니다. 나에게 맞는 것은 setData()가 값을 거부하기 위해 False를 반환하면 뷰가 이전 값으로 되돌아 가야한다는 것입니다. 이것이 가능한가?

[SOLVED] 실제로 setData()의 반환 값은 중요하지 않습니다. QTreeView는 이후에 값을 다시 검색하기 위해 data()를 호출하는 것처럼 보입니다. 내가 가지고있는 문제는 setData()가 False를 반환했지만 내부 데이터를 변경했기 때문입니다.

누군가 내게 설명 할 수 있다면 setData()의 반환 값이 무엇인지 설명 할 수 있다면 좋을 것입니다.

+0

'val'이란 무엇입니까? '가치'가되어서는 안 될까요? – yak

+0

@ lang2 : 귀하의 솔루션에 따라 답변을 편집했습니다. 불편을 끼쳐 드려 죄송합니다. Qt가 뷰 내부에서 편집 할 때 뷰와 모델을 함께 연결하는 방식을 실제로 오해했습니다. 답장을 보내 주셔서 감사합니다. – lunaryorn

답변

1

내가 볼 수있는 유일한 문제는 .setData()의 서명 인 .setData(index, value, role)입니다. 코드 스 니펫이나 문제에 대한 설명은 다른 말을 할만큼 길지 않습니다.

편집 : 실제로, Qt 소스를보고 나면 수정되었습니다. 이 편집 전에 설명한 것과 달리 .setData()의 반환 값은 실제로 뷰에서 사용되지 않습니다.

데이터는 대리자의 .setModelData()에 의해 모델에 커밋됩니다. 일반적으로 Qt는 QStyledItemDelegate을 사용하며, .setModelData() 메서드는 실제로 .setData()의 반환 값을 무시합니다. 따라서보기는 실제로 데이터가 성공적으로 설정되었는지 여부를 신경 쓰지 않습니다. 뷰에있는 셀의 편집기가 닫히면 뷰에는 해당 셀의 값 (.data()에 의해 검색된 값)이 표시됩니다.

그러나 여전히 .setData()의 반환 값은 중요하며 올바른 동작 모델은 적절한 값을 반환해야합니다. 모델은 일반적으로 데이터 소스를 추상화하며, 뷰 자체와는 독립적입니다. 따라서 모델에도 직접 액세스 할 수 있습니다.이 경우 호출자는 반환 값 .setData()을 확인하여 작업이 성공했는지 여부를 확인해야합니다.

+0

. 메소드 서명을 변경했습니다. 반환 값을 출력했는데 실제로는 거짓입니다. – lang2

+0

'print' 문을 추가하여'.setData()'가 뷰에 의해 실제로 호출되는지 확인 했습니까? – lunaryorn

+0

실제 코드로 업데이트했습니다. False 반환 된 볼 수 있지만보기 여전히 잘못된 값으로 업데이트됩니다. – lang2