2010-02-11 3 views
3

저는 노드가 Node (나에 의해 구현 됨) 또는 그 서브 클래스의 인스턴스 인 트리 같은 다형성 데이터 구조를가집니다. 내 응용 프로그램은 부스트를 많이 사용하며 노드는 실제로는 Node*이 아닌 boost :: shared_ptr 유형으로 표현됩니다.Qt 모델을 기존 데이터 구조에 바인딩하기

이제 트리 데이터 구조를 래핑하는 Qt 모델을 만들고 싶습니다. 따라서 모델 인덱스를 내부 데이터 구조의 노드와 연관시키는 방법이 필요합니다.

첫째 :

QModelIndex QAbstractItemModel::createIndex (int row, int column, void * ptr = 0) const

내부 에 주어진 행과 열의 모델 인덱스를 작성

Qt는 그것을하고 두 가지 방법을 지원합니다 그리고 여기에 문제가 온다 pointer ptr.

둘째 :

QModelIndex QAbstractItemModel::createIndex (int row, int column, quint32 id) const

내부 식별자 ID로 지정된 행과 열에 대한 모델 인덱스를 생성한다.

좋아, 내 경우에는 노드를 얼마나 정확하게 연결해야합니까? shared_ptr을 모델 인덱스와 연관시킬 수있는 가능성은 없습니다. 예, 알았습니다. shared_ptr에서 원시 포인터를 받아 CreateIndex()에 공급할 수는 있지만 나쁘지는 않습니다. 너무 안전하지 않은 것처럼 보입니다.

아이디어가 있으십니까?

그런데 일반적으로 Boost/Qt 통합은 최소한 메모리 관리 영역에서는 사소한 것으로 보이지 않습니다.

10x 많이 있습니다.

답변

2

원시 포인터를 전달하지 않고 쉽게 연관 시키려면 공유 메모리를 컨테이너에 넣고 해당 컨테이너 요소의 ID 값을 모델 색인으로 전달하십시오. 예를 들어, 선언문을 만들면

QMap< quint32, boost::shared_ptr<Foo> > index_map; 

을 사용할 수 있습니다. 아마도 기존 포인터에 대해 ID를 복제하지 않도록주의해야합니다. 그것은 다소 지나치게 복잡해 보입니다 ....

(계속 사용 가능하도록하기 위해) 포인터의 목록을 유지 한 다음 QModelIndex의 포인터의 실제 주소도 사용할 수 있습니다. 아마 내가하는 일일 것입니다.

+0

예, 이해합니다. 이 특정 문제를 해결하기 위해 GUID 포인터 맵과 메모리 풀이 모두 사용될 수 있습니다. 그러나 두 가지 해결책 모두 똑같은 문제를 공유하는 것처럼 보입니다. 문제를 적절하게 해결하는 대신 문제를 해킹하려는 시도와 더 비슷합니다. 위의 제안이 QT 모델을 사용하는 "올바른"방법 인 경우 QT의 모델/뷰 아키텍처에서 실제 디자인 문제라고 말하고 싶습니다. – Lev

+0

@Lev : 설계상의 문제 일지 모르지만 해결하기가 쉽지는 않을 것입니다. 사람들이 나무에 넣을 수있는 데이터의 종류를 추적하는 것이 좋습니다.또한 Qt 사람들이 "NG ModelView 클래스"라고 부르는 것을 살펴보고 더 나은 모델인지 확인하는 것이 좋습니다. http://qt.nokia.com/developer/learning/online/talks/developerdays2009/ tech-talks/the-next-generation-qt-item-views –

+0

@cjhuitt : 링크가 끊어졌습니다. – Macke

관련 문제