2012-01-29 12 views
2

QGraphicsItemを自分のカスタムクラスHexagonにサブクラス化しました。 QGraphicsView::itemAt、またはQGraphicsScene::itemAtなどの関数を使用しようとすると、代わりにQGraphicsItemsが検索されるため、Hexagonオブジェクトは返されません。
代わりにHexagonオブジェクトを検索するように指示するにはどうすればよいですか?または、私のHexagonクラスで何かを変更する必要がありますか?あるいは、itemAt()を再実装しますか?QGraphicsItemをサブクラス化すると、QGraphicsScene/ViewでitemAt()を使用できなくなる

現在、QGraphicsView、特にmousePressedEventをサブクラス化してクリックしたHexagonオブジェクトに関する情報を取得しています。

void LatticeView::mousePressEvent(QMouseEvent *event) 
{ 
    Hexagon *hexagon = itemAt(event->pos()); 
    ... 
} 

しかし、私はコンパイルしようとすると、私は次のエラーを取得する:私が欲しいもの

invalid conversion from 'QGraphicsItem*' to 'Hexagon*'

は、私はいくつかの変数にアクセスできるようにクリックされたHexagonオブジェクトを取得できるようにすることです私はHexagonクラスで、QGraphicsItemクラスに暗黙的に定義されていません。あなたが別の型のポインタ変数に割り当てる前にポインタをキャストする必要があります

+0

「私のHexagonオブジェクトは返されません」という意味はどうですか?あなたがQGraphicsItem *からHexagon *に前後にキャストする必要があるように思えます。 –

+0

boundingRect()を実装しましたか? –

+0

"itemAt()"はQGraphicsItemの戻り値の型を持っているので、例えばQGraphicsItemのmousePressedEvent関数でitemAt()を呼び出すと、戻り値の型がQGraphicsItemであるため、私のHexagonオブジェクトは返されません。 QGraphicsItemとHexagonの間を行き来する必要があるかもしれませんが、どうやってそれをやるのか分かりません。私はHexagonクラスのQGraphicsItemを継承しても十分だと思っていましたが、明らかにそうではありません。ありがとう! – Anthony

答えて

1

この作業を取得するには、...

Hexagon *hexagon = (Hexagon*)itemAt(event->pos()); 

しかしitemAt()NULLまたはアイテムかもしれないを返す可能性があるため危険がここにありますHexagonアイテムではありません。

実際には、あなたがこのようにキャストC++スタイルを使用する必要があります。これは、コンパイラによって利用できるようにファイル名を指定して実行時の型情報が必要になります

Hexagon *hexagon = dynamic_cast<Hexagon*>(itemAt(event->pos())); 
if (hexagon != NULL) 
{ 
    hexagon->hexagonMethod(); 
} 

はまた、あなたがqgraphicsitem_cast()を使用できるようになりますtype()と呼ばれる利用可能QGraphicsItem機能がありますが、それはenumを定義関わる少し余分な作業が必要です。

さらに注意すべき点が1つあります。シーンやアイテムがマウスイベントを消費する方法によっては、ムービーがシーン内の何かによって消費された場合、マウスイベントが決してビューに到達しない可能性があるので、mousePressEvent()が呼び出されるとは限りません。

+0

ブリリアント。それは理にかなっている。どうもありがとうございます!私はコードの2番目のビットを使用し、それは完全に動作します。あなたは「これは実行時の型情報があなたのコンパイラから利用可能になることを必要とするでしょう」と言ったことについてもう少し言いたいのですか?私はかなり理解していない。それが問題なら、私はQt Creatorを使用しています。 – Anthony

+0

'dynamic_cast'は、コンパイラによって提供される実行時型情報(RTTI)を必要とし、デフォルトでは有効にならないことがあります。これはQtCreatorとg ++では心配するべきではありません。ここでそれについてもっと詳しく読むことができます:http://www.cplusplus.com/doc/tutorial/typecasting –

+0

素晴らしい。ありがとうございました。 – Anthony

関連する問題