Pregunta

Estoy dibujando polígonos utilizando el marco Vista Gráfica. He añadido un polígono a la escena con esto:

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

Pero necesito para implementar un comportamiento personalizado como la selección, el cursor sobre el indicador, y otras cosas similares en el elemento gráfico. Por lo tanto, declaré una clase que hereda QGraphicsPolygonItem:

#include <QGraphicsPolygonItem>

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

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

No hacer mucho con esa clase hasta ahora, como se puede ver. Pero no debe reemplazar QGraphicsPolygonItem con mi trabajo de clase GridHex? Esto está lanzando una "conversión inválida de 'QGraphicsPolygonItem *' a 'GridHex *'" error:

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

¿Qué estoy haciendo mal?

¿Fue útil?

Solución

supongo escena-> addPolygon devuelve un QGraphicsPolygonItem, que es una clase base de su especialización. Necesitará elenco dinámico ya que sólo se puede hacer la conversión con seguridad por subir la jerarquía en lugar de hacia abajo.

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

editar Si bien mi respuesta le ayuda con su problema de conversión, ¿cómo se puede garantizar que la escena es la creación de objetos de su GridHex? ¿Tiene previsto subclase el objeto de escena, así para volver a los objetos GridHex?

Su subclase QGraphicsScene anularía addPolygon a hacer algo como:

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

Otros consejos

En general, no es una buena idea para un puntero de una clase derivada de señalar a los padres, a causa de 'rebanar'. Le sugiero que haga esto en su lugar

GridHex* hex = new GridHex(scene);
scene->addItem(hex);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top