2014-10-12 4 views
6

표에 대한 데이터를 검색하고 제공하기 위해 QAbstractItemModel 규칙을 사용하는 일부 모델이 있습니다.QtQuick (Grid, TableView)과 함께 기존 (행, 열) C++ 모델 사용

예제 모델에는 여러 개의 열과 행이 있습니다. 불행히도 QtQuick 위젯은 단일 열만 처리 할 수 ​​있습니다. 역할에 따라 다른 "열"이 QtQuick 위젯에 추가됩니다. 뷰의 여러 열이 모델의 동일한 열과 일치합니다. this question and its answer

QML을 C++ 측 (QAbstractProxyModel)에 사용하기위한 추상화를 제공하는 것이 너무 어렵지 않아야한다고 생각했는데, N 행을 요청했을 때 모듈러스 그것을 소스 모델의 열 개수로 나누고 그 결과 실제 열에서 데이터를 검색합니다. 이것은 Grid에서 작동하는 것으로 보이지만 연속 행 인덱스 만 사용하는 대신 TableViewColumn과 역할 이름에 의존하기 때문에 TableView에서는 작동하지 않습니다. 이를 위해 프록시 모델은 원본 모델의 어느 열을 검색 할 것인지에 따라 역할을 구별해야합니다.

http://qt-project.org/forums/viewthread/41793에 대한 답변에있는 스 니펫은 QSqlTableModel을 채택하기 위해 사용하지만 여전히 많은 신호를 사용할 수 없도록 번역하지 못합니다. SQL 소스 모델이 columnsInserted을 방출하는 경우 상상할 수 있듯이 해당 열에 대해 선택된 새 역할과 사용 가능한 역할 이름이 변경된 dataChanged 신호로 변환되어야합니다. QMLifyProxyModel은 4 년 동안 생산 준비가되어 있지 않고 죽은 상태가 아닌 것으로 보입니다.

공식 추천에 따르면 두 세계가 유창하게 함께 작동하도록이 문제를 어떻게 해결할 수 있습니까? QtQuick 뷰가 QAbstractItemModelQTableView이 이미 사용하고있는 (행, 열) 표기법을 사용하지 않는 이유는 무엇입니까?

답변

1

어려운 점은 QtQuick 사용 모델이 QWidget보기보다 더 엄격하다는 것입니다. 따라서 다른 방법으로이 작업을 수행해 볼 가치가 있습니다. 모델을 롤을 사용하도록 변환하고 프록시 모델을 사용하여 TableViewColumn과 같은 방식으로 열 인덱스 + 헤더 데이터에 역할을 매핑하지만 QWidget 뷰에 대해서는 역할을 매핑합니다. 소스가 변경되는 컬럼 수가 아닌 정적 인 역할 수인 경우, 컬럼 삽입 및 제거 신호가 처리하기 쉬워야합니다.

슬프게도 이것은 내장형 모델이나 복잡한 모델에는 도움이되지 않습니다.

대부분의 QtQuick보기는 전화기가 디자인 대상 일 때 1D 모델 용으로 설계되었습니다. 역할은 단일 행/항목의 정렬되지 않은 속성을 스크립트 된 이름으로 매핑하는 데 사용되었습니다.

TableView는 몇 년 후에 나왔고 2D 모델 사용을 허용하기 위해 추가 마일을 수행해야하는 것으로 보입니다. 그러나 QtQuick이 이미 꽤 짐승이었던 한 번에 꽤 많은 추가 작업이 있었을 것입니다. 특히 TableView는 대부분 QML 자체로 작성 되었기 때문에 특히 그렇습니다.