2010-04-23 8 views
0

Je dessine des polygones à l'aide de la structure Graphics View. J'ai ajouté un polygone à la scène avec ceci:Qt - conversion non valide en classe enfant

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

Mais je dois mettre en œuvre un comportement personnalisé comme la sélection, la souris sur l'indicateur, et d'autres choses similaires sur l'élément graphique. Donc, je déclarais une classe qui hérite QGraphicsPolygonItem:

#include <QGraphicsPolygonItem> 

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

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

Ne pas faire beaucoup avec cette classe jusqu'à présent, comme vous pouvez le voir. Mais ne devrait pas remplacer QGraphicsPolygonItem avec mon travail de classe GridHex? Ceci est de lancer une "conversion non valide de 'QGraphicsPolygonItem *' à 'GridHex *'" erreur:

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

Qu'est-ce que je fais mal?

Répondre

0

Je devine que Scène-> addPolygon renvoie une QGraphicsPolygonItem, qui est une classe de base de votre spécialisation. Vous aurez besoin de lancer dynamique car vous ne pouvez faire la conversion en toute sécurité qu'en remontant dans la hiérarchie plutôt que vers le bas.

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

EDIT: Alors que ma réponse aide à votre problème de conversion, comment pouvez-vous garantir que la scène est la création de vos objets GridHex? Avez-vous l'intention de sous-classer l'objet scène pour renvoyer vos objets GridHex?

Votre sous-classe de QGraphicsScene prévaudrait addPolygon faire quelque chose comme:

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

Oh oui, je suppose que je fais tout ce qui est faux ici. Je me familiarise un peu avec le cadre. Je n'ai pas pensé à sous-classer QGraphicsScene avant, mais c'est ce que je vais devoir faire. –

+0

Donc, si je veux ajouter des éléments personnalisés à une scène, je dois sous-classer QGraphicsScene pour pouvoir accepter mes objets personnalisés? Comment dois-je définir une sous-classe QGraphicsScene pour pouvoir y ajouter mes éléments personnalisés? –

1

Généralement, ce n'est pas une bonne idée pour un pointeur d'une classe dérivée de pointer le parent, à cause de 'slicing'. Je vous suggère de le faire à la place

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

Merci pour la pointe de coupe. –

+0

Dans le cas que vous avez montré, mon objet GridHex ne serait-il pas coupé, puisque QGraphicsScene :: addItem() reçoit un QGraphicsItem comme paramètre? –