2009-12-31 5 views
10

Qt (C++ 사용)로 응용 프로그램을 작성하고 있으며 트리 구조에서 개체 구조를 나타내야합니다. 이 작업을 수행하는 방법 중 하나는이 모델을 만드는 것이지만, 주제에 관한 Qt 문서를 읽은 후에도 여전히 혼란 스럽습니다.트리 뷰용 Qt 모델 만들기

"구조"는 매우 간단합니다. std::vector 컨테이너에 Task 개체를 보유하고있는 Project 개체가 있습니다. 이 타스크는 하위 타스크를 보유 할 수도 있습니다.

이미 Qt의 XML 클래스를 사용하여 &을 읽고이 프로젝트를 XML 파일에 쓰거나 작성하는 방법을 작성했습니다.

처음부터 모델을 만드는 데 더 많은 문서 또는 "권장 읽기"가 있습니까? 어떻게 이것을 구현하기 시작하는 것이 좋습니다?

답변

17

QTreeView 초보자의 주된 문제는 index()parent()입니다.

http://www.hardcoded.net/articles/using_qtreeview_with_qabstractitemmodel.htm

예제 코드는 파이썬에 있지만 원칙은 동일하게 유지 : 나는 얼마 전에 이것에 대해 기사를 작성했습니다.

+0

버질, 환상적입니다. 나는 QStandardItemModels를 다시 사용하는 것을 결코 권장하지 않을 것이다. – andref

+0

버질에게 감사드립니다. 이제는 깨끗하고 단순하며 재사용이 가능한 나무가 있습니다. –

9

대신 Virgil이 말한 것을 QStandardItemModel class로 사용하고이 클래스를 사용하여 나무를 쌓을 수 있습니다. 아래의 예는 다음과 같습니다이 도움이

QStandardItemModel* model = new QStandardItemModel(); 

QStandardItem* item0 = new QStandardItem(QIcon("test.png"), "1 first item"); 
QStandardItem* item1 = new QStandardItem(QIcon("test.png"), "2 second item"); 
QStandardItem* item3 = new QStandardItem(QIcon("test.png"), "3 third item"); 
QStandardItem* item4 = new QStandardItem("4 forth item"); 

model->appendRow(item0); 
item0->appendRow(item3); 
item0->appendRow(item4); 
model->appendRow(item1); 

ui->treeView->setModel(model); 

희망, 데이터 구조 매핑 오른쪽에있는 모델을 얻을 정말이 작업을 얻을 수

3

기본 트릭을 간주한다. 열심히 보일지 모르지만 그렇게 할 필요는없는 것.

먼저 모델 색인을 빌드하는 데 QAbstractItemModel::createIndex을 사용하면 사용하도록 선택한 createIndex의 인스턴스에 따라 색인에 추가 할 수있는 포인터 또는 uint32를 통해 자신의 데이터 구조를 참조 할 수 있습니다.

둘째로, 마음에 분명히있는 구조를 가졌으므로 parentindex 함수를 작성하는 것은 매우 쉽습니다. 여기서 핵심은 모델 루트가 unintialized QModelIndex 인스턴스라는 것을 이해하는 것입니다. 나는. QModelIndex::isValid() == false은 루트를 나타냅니다.

셋째, 다중 열로가는 경우 첫 번째 열에 만 자식이 있음을 기억하십시오.

넷째, 기대하는대로 일을하는지 확인하려면 ModelTest 클래스를 사용하십시오. 모델을 모니터하고 검사하여 Qt 모델 뷰 클래스가 기대하는 규칙을 따르도록합니다.

+0

모델 아키텍처에 대해 간단하고 명확한 설명. 고맙습니다! – satishgoda

관련 문제