2013-01-17 4 views
1

QTreeViewQAbstractItemModel 하위 클래스로 채워 지므로 리프 노드를 사용자가 확인할 수 있습니다. 리프가 아닌 노드의 자손 리프 노드 중 적절한 서브 세트가 점검되면 해당 노드가 부분적으로 점검됩니다 (Qt::CheckStateRoleQt::PartiallyChecked 임).QTreeView 부분 검사 노드를 클릭하면 노드를 선택 취소 할 수 있습니까?

현재 사용자가 부분 검사 노드를 클릭하면 검사 상태가 Qt::Checked으로 변경됩니다. 대신 노드를 지우고 싶습니다 (Qt::Unchecked). 이 동작을 사용자 정의하는 방법이 있습니까? QCheckBox으로 제어하려면 QAbstractButton::nextCheckState()을 무시하고 QTreeView과 비슷한 항목을 찾을 수 없습니다.

답변

1

bool QAbstractItemModel::setData (const QModelIndex & index, const QVariant & value, int role = Qt::EditRole) 

For Qt::CheckStateRole 

그래서 당신이 값이 Qt는 :: PartiallyChecked에받는 모델 사항 setData 당신을 원하는 동작을 구현합니다. 항목 하위 항목을 트래버스하여 Qt :: Unchecked로 설정하고 현재 항목도 변경합니다.

+1

'value'는'Qt :: PartiallyChecked'가 아니며'Qt :: Checked'입니다. 그것이 문제이다. – ecatmur

+0

그래서'Qt :: Checked'를받을 때 해보십시오. 뭐가 문제 야? 필요한 경우, 데이터 (색인, 역할)를 사용하여 현재 상태에 액세스 할 수도 있습니다 – Trompa

+2

마우스 클릭 (또는 스페이스 바 누르기)에서 호출 된'setData'와 다른 원인에서 구별되는'setData'를 구분하지 않습니다. 여기서'Qt :: Checked'는 원하는 값입니다. 더 좋은 방법이 있기를 바랍니다. (어떤 코드가'setData'를 호출합니까?) – ecatmur