2014-08-28 1 views
2

저는 오래된 Delphi/FreePascal/Lazarus 프로그래머입니다. 저는 1 년 동안 Qt와 C++로 프로그래밍하고 있습니다. Qt에서 가장 고통스러운 것은 모델 프로그래밍입니다. 특히 효율적입니다. 예를 들어 QStandardItemModel을 1 백만 레코드로 채우는 데는 15 초 정도 걸리며 700MB의 메모리 사용량과 QTreeView 스크롤은 거의 불가능합니다 (100 % CPU, 각 스크롤은 보이는 항목조차도 검증하지 않는 것 같습니다). 비교를 위해 Lazarus에서 하나의 가상 메소드 OnGetData를 재정의하는 TVirtualTreeView가 있습니다. 인수에서 행 및 열 인덱스를 가져오고 TList (QList와 같은 것) 또는 동적 배열에서 데이터를 반환합니다. 결과 : 1 백만 레코드 = 150 밀리 초, RAM에서 20 메가 바이트, 완전히 책임있는 스크롤 (OnGetData는 보이는 항목에만 호출 됨). 나는 또한 QAbstractItemModel, 많은 코딩을 시도하고 메모리 사용을 줄였다.Qt 모델 대체

내 질문 : 모델 프로그래밍을위한 대안이 있습니까? 몇 달 전에 QTreeView에서 사용자 지정 데이터 집합에 대한 자습서를 보았지만 지금은 찾을 수 없습니다. 그들은 간단한 QList를 사용하고 QTreeView에서 몇 가지 메소드를 오버라이드합니다.

감사합니다.

+3

QStandardItemModel은 오버 헤드가 많은 복잡한 복합 거래입니다. 백만 가지 항목의 경우 맞춤 모델이 필수입니다. 그런 다음 QAIM은 자체 데이터 용 API 일뿐입니다. 하나의 OOTB 옵션은 sqlite와 주식 Qt SQL 모델 일 수 있습니다. – hyde

+0

몇 가지 샘플 코드를 게시 할 수 있습니까? QStandardItemModel은 많은 항목에서 제대로 수행되지 않습니다. [이 질문] (http://stackoverflow.com/q/21159095/1583123)을 참조하십시오. –

+0

또한 모델 - 뷰 시스템은 아마도 Qt의 가장 복잡한 부분이므로 실제 학습이 필요한 큰 과제로 학습하십시오. QAbstractListModel을 서브 클래 싱하는 것과 같은 간단한 작업으로 시작하여 곧바로 QAIM을 서브 클래 싱하는 것으로 넘어 가지 마십시오. – hyde

답변

2

Ok QAbstractItemModel 설명서를 읽는 동안 모델을 신중하게 작성했습니다. 나는 메모리 사용량을 많이 줄 였지만 1 백만 레코드를 스크롤하는 동안 여전히 뒤쳐져 있었다. QTreeViewQListView/QTableView으로 변경했으며 모든 것이 매우 빠르게 작동했습니다. 그래서 QTreeView 속성을 확인하고 itemsExpandable을 비활성화하고 uniformRowHeights을 확인했습니다. 마침내 나의 견해는 빠르고 격렬하다. :) 1 백만 레코드로드 = 1 초, RAM에 140MB 이상, 지연없이 원활한 스크롤. 감사!

+0

안녕 Dibo. 여기에 예제 코드를 게시 할 수 있습니까? 지금 구현하려면 도움이 필요합니다. – ngvntoan

2

QAbstractItemModel에서 직접 모델을 파생시킵니다. 사용자 지정 (효율적인) 데이터 저장을위한 인터페이스로 사용하십시오.

관련 문제