2010-04-23 4 views
0

그래픽 뷰 프레임 워크를 사용하여 다각형을 그립니다. 나는이와 함께 현장에 다각형을 추가 :Qt - 하위 클래스로의 변환이 올바르지 않습니다.

QGraphicsPolygonItem *poly = scene->addPolygon(QPolygonF(vector_of_QPointF)); 
poly->setPos(some_point); 

하지만 그래픽 항목에 선택 표시를 통해 마우스, 및 기타 유사한 것들과 같은 일부 사용자 지정 동작을 구현해야합니다. 당신이 볼 수있는

#include <QGraphicsPolygonItem> 

class GridHex : public QGraphicsPolygonItem 
{ 
public: 
    GridHex(QGraphicsItem* parent = 0); 
}; 

GridHex::GridHex(QGraphicsItem* parent) : QGraphicsPolygonItem(parent) 
{ 
} 

는 지금까지 그 클래스와 함께 많은 일을하지 : 그래서 QGraphicsPolygonItem을 상속하는 클래스를 선언했다. 하지만 QGraphicsPolygonItem을 GridHex 클래스 작업으로 대체해서는 안됩니까? 이 오류 " 'GridHex *'에 'QGraphicsPolygonItem *'에서 유효하지 않은 변환"는 던지고있다 : 내가 잘못 뭐하는 거지

GridHex* poly = scene->addPolygon(QPolygonF(vector_of_QPointF)); 

?

답변

0

을 제안한다. 당신은 동적 인 캐스트를해야합니다. 왜냐하면 오직 아래쪽이 아닌 계층으로 올라감으로써 안전하게 변환을 할 수 있기 때문입니다.

GridHex* poly = dynamic_cast<GridHex*>(scene->addPolygon(QPolygonF(vector_of_QPointF))); 
if (poly != NULL) { 
    // You have a gridhex! 
} 

편집 : 내 대답은 전환 문제에 도움이 동안, 당신은 어떻게 장면이 GridHex 객체를 생성하는 것을 보장 할 수 있습니까? GridHex 객체를 반환하기 위해 장면 객체를 서브 클래스화할 계획입니까? 슬라이싱 팁

// Call the base class 
QGraphicsPolygonItem* result = QGraphicsScene::addPolygon(vectorOfPoints); 
// Return your stuff 
return new GridHex(result); 
+0

아 맞아, 내가 여기서 모든 일을 잘못하고있는 것 같아. 나는 아직도 프레임 워크에 익숙해 져있다. 전에 QGraphicsScene을 서브 클래 싱하는 것을 생각하지 않았지만, 내가해야 할 일이 그 것이다. –

+0

그래서 장면에 사용자 지정 항목을 추가하려면 QGraphicsScene을 하위 클래스 화하여 사용자 지정 항목을 받아 들일 수 있어야합니까? 내 맞춤 항목을 추가 할 수 있도록 QGraphicsScene 서브 클래스를 어떻게 설정해야합니까? –

1

일반적으로 '조각 내기'때문에 부모를 가리키는 파생 클래스의 포인터가 좋지 않습니다. 난 당신이 내가 addPolygon이 전문화의 기본 클래스 인 QGraphicsPolygonItem을 반환 장면 -> 추측하고있어이 대신

GridHex* hex = new GridHex(scene); 
scene->addItem(hex); 
+0

감사 :

귀하의 QGraphicsScene의 서브 클래스는 같은 것을 할 addPolygon를 오버라이드 (override)합니다. –

+0

QGraphicsScene :: addItem()이 QGraphicsItem을 매개 변수로 받기 때문에 표시 한 경우 GridHex 객체가 슬라이스되지 않습니까? –

관련 문제