2016-07-30 15 views
0

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シェイプを作成/移動/回転/削除する学習プロジェクトです。誰かが全部を見たいと思ったら、私に知らせてください。

+0

http://www.cplusplus.com/doc/tutorial/typecasting/#dynamic_castによると、「dynamic_castは、クラスへのポインタと参照(またはvoid *)でのみ使用できます」と記載されています。それは読む価値があるかもしれません。 –

+0

あなたは既にあなたの質問に答えましたが、将来については['qgraphicsitem_cast'](http://doc.qt.io/qt-5/qgraphicsitem.html#qgraphicsitem_cast)も見てください。 – ilotXXI

+0

チップをありがとう。それは私が知らなかったものです。 – cagem12

答えて

0

これでわかりました。基本クラスのメソッドでイベントを渡すようにしてください。シンプル!これは、mousePressEvent()、mouseMoveEvent()、およびmouseReleaseEvent関数でも機能します。

void CustomGraphicsView::contextMenuEvent(QContextMenuEvent* event) 
{ 
    // if the event is on a GGraphicsItem just pass the event along 
    if (itemAt(event->pos())) { 
    QGraphicsView::contextMenuEvent(event); 
    } 
    else 
    { 
    QMenu menu; 
    ... create popup for the CustomGraphicsView 
関連する問題