2008-09-25 4 views
6

나는 두 개의 뷰와 같은 모델을 가지고있다.프록시 모델로 작업 할 선택 모델을 얻으려면 어떻게해야합니까?

Model ---> OSortFilterProxyModel ---> OListView 
Model ------------------------------> OTableView 

사용자가 뷰 중 하나에서 무언가를 선택하면, 다른 뷰는 그 뷰를 미러링하기를 원한다. 그래서 QSelectionModel을 사용하여 연결하는 방법을 생각했습니다. 그러나 이것은 효과가 없습니다. 보기에 두 개의 다른 모델이 있다고 생각하기 때문에 실제로 같은 모델을 가지고있을 때 느낌이 들었습니다. 이 방법을 사용할 수 있습니까?

답변

2

아마도보기에는 두 가지 모델이있을 수 있습니다. 하나는 원래 모델이고, 다른 하나는 정렬 필터 모델입니다.

이 방법이 효과가 있을지 모르겠지만 Qt가 "활성화 됨"으로 간주하는 기능에 따라 다르지만 각보기의 활성화 된 슬롯에 기능을 연결할 수 있습니다. 이것들은 모델 색인을 전달합니다. 적절한 방향 (mapFromSource 및 mapToSource)으로 프록시 모델을 통해 모델 인덱스를 보내야합니다. 그런 다음 다른보기에서 setCurrentIndex를 호출하십시오.

활성화 된 신호에 대한 설명서에는 "활성화 됨"으로 간주되는 것이 플랫폼에 따라 다릅니다라고되어 있습니다. 선택 모델의 선택 변경 신호와 같이 래치 할 수있는 다른 신호가있을 수 있습니다. 사용자가 볼 수있는 선택을 변경하려면 다른 호출을해야 할 수도 있습니다. 마지막으로, 소스 모델과의 매핑에 대해 기억하는 한 파생 된 QSelectionModel에서 가능하거나 더 쉬울 수도 있습니다.

1

모델 하위 클래스가 어떻게 구현되는지는 확실하지 않지만 선택은 영구 모델 색인이 올바른지 여부에 달려 있습니다. 소스 코드를 제공 할 수 있습니까? 두 모델 모두에서 동일한 선택 모델을 사용하고 있습니까?

1

QAbstractProxyModel::mapSelectionFromSourceQAbstractProxyModel::mapSelectionToSource과 결합하여 void QItemSelectionModel::select을 사용해야합니다. QListView의를 SelectionChange 신호 처리기에서는 QTableView의 signalChange 신호 처리기에서 mapSelectionFromSource와

tableView->selection()->select(
    proxyModel->mapSelectionToSource(selected), 
    QItemSelectionModel::ClearAndSelect); 

과 유비가 있어야합니다.

테이블이 테이블의 선택 등을 변경하는 목록의 선택을 변경하면 Qt가 무한 재귀를 방지하는지 확실하지 않습니다.

관련 문제