2017-02-15 21 views
1

테이블의 특정 행과 열만 표시하는 사용자 지정 QSortFilterProxyModel이 있습니다. 또한 테이블의 특정 값이 그려지는 방식을 제어하는 ​​사용자 지정 QItemDelegate가 있습니다. 나는 그것을 필요로하는 열에 대해서만 델리게이트를 적용 할 것이고, 그 문제는 내가 프록시 모델로 특정 열을 숨겨서 델리게이트를 망칠 수있는 것 같다. 예를 들어QSortFilterProxyModel과 함께 사용자 지정 QItemDelegate 사용

, 나는 AG 열이 있다고 가정하고 내가

A B C D E F G 
------------------- 
o o o o o X o 
o o o o o X o 
o o o o o X o 

내 프록시 모델은 열 B를 표시하지 않는 경우 F.

열을 내 사용자 지정 대리자를 적용, 내 대리인이 대신 열 G에 적용하기 끝 .

A C D E F G 
---------------- 
o o o o o X 
o o o o o X 
o o o o o X 

나는

table->setColumnHidden(B, true); 

를 호출하여보기에 열을 숨겨 대신 프록시 모델의 문제를 해결 할 수있었습니다 그리고 나는 가정이 작동하지만 유일한 그 해결책? 대리점 모델과 프록시 모델 클래스가 함께 작동하지 않는 버그처럼 보입니다. 같은 모델에서 둘 중 하나만 사용할 수있는 것처럼 잘 처리됩니다.

+0

내가 아는 한 예상대로 작동하고 있습니다 : 항목 대리자는 모델에 대해 불가지론적인 것으로 간주되는보기의 열에 적용됩니다. 또한 모델 *은 프록시 모델이므로 정확한 열에 적용됩니다. – cbuchart

+0

당신이 옳다고 생각합니다 @cbuchart. 뷰의 setItemDelegateForColumn을 호출하면 모델의 뷰가 아닌 뷰의 열이 될 것입니다. 열 번호를 변경할 수있는 프록시 모델을 사용하고 있다면 아래의 제안 된 대답이 유효한 해결 방법이라고 생각합니다. – Moohasha

+0

qobject_cast를 수행하여 모델이 프록시 모델인지 확인할 수 있습니다. – cbuchart

답변

1

필터링 된 색인 (열당 하나)에 mapToSource을 시도하고 원본 열을 확인하고 그에 따라 해당 항목 대리인을 설정할 수 있습니다.

for (int i = 0; i < proxy->columnCount(); ++i) { 
    if (proxy->mapToSource(proxy->index(0, i)).column() == 6) { 
    table->setItemDelegateForColumn(i, yourDelegate); 
    } 
} 
+0

그게 효과가있는 것 같아, 내가해야 할 일이 이상하게 보인다. 뷰 또는 프록시 모델이 자동으로 그렇게 할 것으로 기대합니다. 나는 그것에게 총을 줄 것이고 만약 그것이 예상대로 작동한다면 그것을 대답으로 받아 들일 것이다. – Moohasha

+0

네, 그것은 자동적이지 않을 것입니다. 적어도 모델은 텍스트 정렬과 같은 다른 역할을 제안하는 것과 동일한 방식으로 항목 위임을 제안 할 수 있습니다. – cbuchart

+0

@Moohasha 문제가 해결 되었습니까? – cbuchart

0

위젯은 디스플레이 위임자에서 열 위치 검색을 사용하지 않는 많은 이유 중 하나입니다. 사용자가보기의 열을 다시 정렬하게하면 문제가됩니다. 나는 그것이 버그라고 생각하지 않지만, 과거에 아이템 모델 레벨에서 기본 델리게이트를 할당하는 방법이 있었으면 좋겠다. 아마도 역할이나 무언가로서.

어쨌든 데이터를 제어 할 수있는 간단한 해결 방법은 데이터 자체에 열/필드 ID를 맞춤 데이터 역할로 저장하는 것입니다 (예 : modelIndex.setData(FIELD_ONE, Qt::UserRole + 1) (예 : FIELD_ONE은 열의 일부 열거 형입니다.) 그런 다음 대리인은 역할을 확인하고 수행 할 작업을 알 수 있습니다.