2016-07-30 4 views
0

QGraphicsView 및 QGraphicsRectItem에서 파생되었습니다. 두 클래스에서 contextMenuEvent를 오버로드하여 팝업 메뉴를 제공했습니다. 항목을 클릭 할 때 QGraphicsItem 팝업 메뉴의 공백을 클릭하면 QGraphicsView 컨텍스트 메뉴가 필요합니다.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

는 "dynamic_cast는 단지 클래스에 대한 포인터 및 참조 (또는 * 무효와) 함께 사용할 수 있습니다."라고 그것은 읽을만한 가치가있을 것입니다. –

+0

당신은 이미 당신의 질문에 답했을뿐 아니라 미래를 위해서 ['qgraphicsitem_cast'] (http://doc.qt.io/qt-5/qgraphicsitem.html#qgraphicsitem_cast)를보십시오. – ilotXXI

+0

팁 주셔서 감사. 그것이 내가 모르는 것에 관한 것입니다. – cagem12

답변

0

좋아요, 그래서 알아 냈습니다. 그냥 기본 클래스 메서드를 통해 이벤트를 전달해야합니다. 단순한! 이것은 mousePressEvent(), mouseMoveEvent() 및 mouseReleaseEvent 함수에도 적용됩니다. http://www.cplusplus.com/doc/tutorial/typecasting/#dynamic_cast

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