0

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

ご覧のとおり、これまでのところ、そのクラスにはあまり取り組んでいません。しかし、QGraphicsPolygonItem を私の GridHex クラスに置き換えるべきではありませんか? これにより、「「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 に答える