0

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

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));

我究竟做错了什么?

4

2 回答 2

1

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

GridHex* hex = new GridHex(scene);
scene->addItem(hex);
于 2010-04-23T13:19:10.107 回答
0

我猜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);
于 2010-04-23T13:20:25.300 回答