2016-09-02 5 views
0

키를 입력/반환 할 때 선택된 상자를 확인하는 체크 박스를 사용하여 목록보기를 만들려고합니다. 나는 (그래 내가 그것을 서브 클래스한다고,하지만 난 그 작업 얻을 수 없었다) 내 MainWindow를위한 eventfilter의 재정이 할 내가 itemFromIndex 메소드로부터 반환 된 없음 값을 얻을 eventfilter에서QStandardItemModel itemFromIndex 메서드가 None을 반환하는 이유는 무엇입니까? (인덱스가 유효하지 않습니다)

.isValid()을 통해 문제없이 색인을 전달한 경우에도 마찬가지입니다. 분명히 나는 ​​뭔가를 놓치고있다. 그러나 나는 그것을 이해할 수 없다 - 완전히 다른 지표를보고 있는가? 모델이 업데이트되지 않았습니까? 대체 방법에

어떤 조언을 내가 파일을로드 할 때, 그것은 단지라고 내가 항목 모델 (QStandardItemModel)을 채우기 위해 사용하는 방법입니다

환영합니다. 나는 selectionModel의에 대한 변수를 만들어 내 QListView

self.sigInSelection = self.siNLV.selectionModel() 
    self.siNLV.installEventFilter(self) 

방법이 및 필터링처럼 보이는 eventFilter에 eventfilter를 설치하는 경우

def update_siNLV(self,names,model): model.clear() for name in names: item = Qg.QStandardItem(name) item.setCheckState(Qc.Qt.Unchecked) item.setCheckable(True) model.appendRow(item) 

초기화 방법에서입니다 메서드의 일부가 작동합니다 (Enter 키를 눌러 선택한 인덱스를 인쇄하도록했습니다)

주석에서 설명하고있는 바와 같이
+1

'index'가'sigInSelection'에서 유효한 인덱스인지 확인한 것 같습니다. * 선험적 * 이유가 없으므로'sigInModel'에도 유효한 인덱스 여야합니다. –

+0

네 말이 맞아. 그래서 'sigInModel'이 listview로 설정되어 있어도'siNLV' 내장형 selectionmodel과 인덱스를 공유하지 않습니까? 그렇다면 선택을 내 데이터에 어떻게 연결합니까? –

+0

'eventFilter'가 작동한다고 했으므로 어디에서'itemFromIndex'를 호출해야 볼 수 없습니다. 우리는 아마도 좀 더 많은 코드를보아야 할 것입니다. MVCE가 도움이 될 수 있습니다. – strubbly

답변

0

: QItemSelectionModel.selectedIndexes()에 의해 반환

지수는 뷰에서 온 뷰과 그 모델 사이의 연결과 관련이있다. 해당 모델의 신원은 QModelIndex.model()을 호출하여 찾을 수 있습니다.이 경우 원하는 모델이 아닙니다. 대신 원하는 QStandardItemModel과보기 사이에있는 프록시 모델입니다.

원하는 모델을 찾으려면 QAbstractProxyModel.mapToSource()을 사용해야합니다.

source_index = self.proxy.mapToSource(index) 
item = self.sigInModel.itemFromIndex(source_index) 

더 일반적으로는 임의의 프록시 구조를 탐색 할 수와 같은 코드 무언가에 의해 하나의 알려진 프록시의 하드 코딩 된 사용을 방지하기 : 그래서 당신은 같은 코드 뭔가를 사용할 수 있습니다

proxy_model = index.model() 
while proxy_model != self.sigInModel: 
    index = proxy_model.mapToSource(index) 
    proxy_model = index.model() 
item = self.sigInModel.itemFromIndex(index) 

그러나 이것은 아마도 단순한 단일 프록시가 있음을 알고있는이 경우에는 과장입니다.

관련 문제