Qt - 无效转换为子类

时间:2010-04-23 13:11:45

标签: qt inheritance qgraphicsview qgraphicsitem

我正在使用Graphics View框架绘制多边形。我在场景中添加了一个多边形:

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)
{
}

到目前为止,对于该课程没有做太多,正如你所看到的那样。但是不应该用我的GridHex类替换QGraphicsPolygonItem吗?这会导致“从'QGraphicsPolygonItem *'到'GridHex *'的无效转换”错误:

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

我做错了什么?

2 个答案:

答案 0 :(得分:1)

通常,由于“切片”,派生类的指针指向父级并不是一个好主意。我建议你这样做

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

答案 1 :(得分:0)

我在猜测scene-&gt; 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);