QT-子供クラスへの無効な変換
-
01-10-2019 - |
質問
グラフィックビューフレームワークを使用してポリゴンを描画しています。これでシーンにポリゴンを追加しました:
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));
私は何が間違っているのですか?
解決
シーンを推測しています - > 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);
他のヒント
一般的に、「スライス」のために、派生クラスのポインターが親を指すのは良い考えではありません。代わりにこれを行うことをお勧めします
GridHex* hex = new GridHex(scene);
scene->addItem(hex);
所属していません StackOverflow