Qt - недопустимое преобразование в дочерний класс - PullRequest
0 голосов
/ 23 апреля 2010

Я рисую полигоны, используя каркас графического представления. Я добавил полигон на сцену с этим:

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

Но мне нужно реализовать несколько пользовательских действий, таких как выделение, указатель мыши и другие подобные вещи в графическом элементе. Поэтому я объявил класс, который наследует QGraphicsPolygonItem:

#include <QGraphicsPolygonItem>

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

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

Пока что вы мало что делаете с этим классом, как видите. Но не должна ли замена QGraphicsPolygonItem моей работой с классом GridHex? Это приводит к ошибке «недопустимое преобразование из QGraphicsPolygonItem * в GridHex *»:

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

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

Как правило, указатель производного класса не является хорошей идеей для указания родительского элемента из-за «нарезки». Я предлагаю вам сделать это вместо

GridHex* hex = new GridHex(scene);
scene->addItem(hex);
0 голосов
/ 23 апреля 2010

Я предполагаю, что scene-> addPolygon возвращает QGraphicsPolygonItem, который является базовым классом вашей специализации. Вам понадобится динамическое приведение, поскольку вы можете безопасно выполнять преобразование, поднимаясь вверх по иерархии, а не вниз.

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

РЕДАКТИРОВАТЬ: Хотя мой ответ поможет с вашей проблемой конверсии, как вы можете гарантировать, что сцена создает ваши объекты GridHex? Планируете ли вы создать подкласс объекта сцены и вернуть ваши объекты GridHex?

Ваш подкласс QGraphicsScene переопределит addPolygon, чтобы сделать что-то вроде:

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