2010-07-06 1 views
14

매핑 응용 프로그램에서 작업 중이며 테이블, 양식 및지도의 그래픽 개체로 데이터 개체를 표시해야합니다. 저는 PyQt를 사용하고 있습니다 만, 이것은 Qt 질문이 아니기 때문에 실제로 중요하지 않습니다.Qt Model/View 프레임 워크를 Graphics View 프레임 워크와 함께 사용하는 방법

테이블과 폼 뷰가 필요할 경우 쉽게 할 수 있지만 Qt Model/View 프레임 워크 만 사용하면됩니다. 그러나 그래픽 뷰 프레임 워크를 사용하여 실제로 사용할 수있는 기능 만 제공하려면 맵보기가 필요합니다. 기본적으로 데이터 모델로 작동하는 QGraphicsScene이 포함 된 자체 Model/View 프레임 워크입니다.

나는 이것을 수행하는 두 가지 방법을 생각할 수 있습니다. 하나는 QAbstractItemModel에서 하위 클래스로 분류 된 권위있는 모델로 시작하여 QAbstractItemView의 하위 클래스에 연결하고 거기에서 QGraphicsItems를 생성하고 업데이트합니다. QGraphicsItems와의 상호 작용을 통해 데이터 항목과의 사용자 상호 작용 및 데이터 항목의 변경을 처리하는 방법을 잘 모르기 때문에보기에는 불편합니다.

내가 할 수있는 다른 방법은 QGraphicsScene을 신뢰할 수있는 데이터 소스로 취급하여 각 QGraphicsItem의 .data() 속성에 데이터 개체를 저장하는 것입니다. 그런 다음 QAbstractItemModel을 서브 클래 싱하여 데이터 저장소 인 것처럼 장면의 데이터에 액세스하도록 작성하고, 다른 뷰는이를 모델로 사용합니다. 그래도 모델의 씬의 데이터에 대한 변경 사항을 어떻게 전파 할 수 있습니까?

어느 방법을 사용하든 관계없이 프레임 워크에서 처리되지 않는 간격이있는 것처럼 보입니다. 모델/뷰에서 모든 변경 사항은 모델에서 이루어진 것으로 가정합니다. 그래픽보기에서는 모든 변경 사항이 장면에서 이루어진 것으로 가정합니다.

QAbstractItemModel (신뢰할 수있는) -> QAbstractItemView -> QGraphicsScene 또는 QGraphicsScene (신뢰할 수있는) -> QAbstractItemModel -> Other Views를 선택하는 방법이 있습니다. 왜 다른 하나를 선택하겠습니까? 그리고 어떤 어려움이 예상됩니까? 다른 사람들이 Qt의 쌍방향 모델/뷰 프레임 워크 간의이 격차를 메꿀 필요가 있었습니까? 어떻게 했습니까?

답변

10

QAbstractItemModel (권위) -> QAbstractItemView-> QGraphicsScene

의심의 여지없이. 나는 이것을하기 전에 약간의 복제 (적어도 피할 수없는 몇 가지)를 필요로하지만 너무 나쁜 것은 아무것도 없다.

이렇게하면 장면과 함께 표준보기에서 데이터를 표현할 수 있습니다.

내 최고의 조언은 QGraphicsItem-QPersistantModelIndexQHash와 사용자가 만드는 QAbstractItemViewQGraphicsScene를 저장하는 것입니다. 이를 통해 모델/뷰 랜드 (QModelIndex)에서 그래픽 뷰 랜드 (QGraphicsItem)

+0

사이에 빠르게 이동할 수 있습니다. 다른 방법으로도 할 수 있다는 것을 깨닫기 전에이 방법을 사용했습니다. 내가 dataChanged(), rowsInserted() 및 rowsAboutToBeRemoved() 서브 클래스해야 할 것이라고 AQbstractItemView 유일한 방법을 추측하고있어? 그런 다음 장면의 항목을 적절하게 관리합니다. QPersistentModelIndexes를 QGraphicsItems에 저장하겠습니다. QHash 아이디어가 마음에 들어요. 나는 Python 사전을 사용하기 위해 PyQT를 사용하고 있지만 어느 쪽이든 좋은 최적화가된다. –

+0

@Simon : 네가 생각한대로 dataChanged()에서 데이터와 표현에 따라 QGraphicsScene의 일부 코드를 복제해야 할 수도 있지만 다시 말해 사소한 것이어야한다. –

+0

기본 수준에서 작동합니다. 예! –