QGraphicsViewとQGraphicsRectItemの両方から派生しました。両方のクラスでcontextMenuEventをオーバーロードしてポップアップメニューを提供しました。 QGraphicsViewのコンテキストメニューは、項目をクリックするとQGraphicsItemポップアップメニューの空白をクリックすると表示されます。Qt:QGraphicsViewからQGraphicsSceneContextMenuEventを渡します。
最初の実装では、クリックした場所に関係なくQGraphicsViewポップアップが表示されます。 QGraphicsSceneContextMenuEventため
void CustomGraphicsView::contextMenuEvent(QContextMenuEvent* event)
{
if (QGraphicsItem *item = itemAt(event->pos())) {
MyRect* rect = dynamic_cast<MyRect*>(item);
QGraphicsSceneContextMenuEvent* context_event = dynamic_cast<QGraphicsSceneContextMenuEvent*>(event);
if (rect && context_event)
rect->contextMenuEvent(context_event);
}
else {
QMenu menu;
... create the QGraphicsView popup menu
}
}
のdynamic_castはので、私はRECTのためによってContextMenuEventを呼び出すことはありません失敗し、次のようにだから私はによってContextMenuEventを変更しました。 rect-> contextMenu()にイベントを渡そうとするとコンパイルされないので、キャストを試みました。
これを行う正しい方法は何ですか?
これは、Qtを使用して2Dシェイプを作成/移動/回転/削除する学習プロジェクトです。誰かが全部を見たいと思ったら、私に知らせてください。
http://www.cplusplus.com/doc/tutorial/typecasting/#dynamic_castによると、「dynamic_castは、クラスへのポインタと参照(またはvoid *)でのみ使用できます」と記載されています。それは読む価値があるかもしれません。 –
あなたは既にあなたの質問に答えましたが、将来については['qgraphicsitem_cast'](http://doc.qt.io/qt-5/qgraphicsitem.html#qgraphicsitem_cast)も見てください。 – ilotXXI
チップをありがとう。それは私が知らなかったものです。 – cagem12