2012-05-26 4 views
8

사용자가 장면의 빈 부분을 마우스 오른쪽 버튼으로 클릭 할 때 팝업을 표시하는 방법이 있습니까?QGraphicsScene에 팝업 메뉴 표시 클릭 또는 오른쪽 클릭

저는 Qt를 처음 접했고 슬롯과 서브 클래 싱을 시도했지만 아무 소용이 없습니다.

각각 그러한 슬롯 :

"error: 'QMouseEvent' has not been declared"

onMouseRelease 이벤트를 구현하려고합니다.

답변

10

QGraphicsView는 QGraphicsScene의 내용을 표시하는 데 사용되는 위젯입니다. 따라서 컨텍스트 메뉴 (팝업 메뉴)를 구현하는 올바른 위치는 QGraphicsView입니다.

당신은 ContextMenuEvent로 기능이를 QGraphicsView에서 자신의 클래스를 상속 다시 구현해야합니다

void YourGraphicsView::contextMenuEvent(QContextMenuEvent *event) 
{ 
    QMenu menu(this); 
    menu.addAction(...); 
    menu.addAction(...); 
    ... 
    menu.exec(event->globalPos()); 
} 

또한 Qt의 Menus Example 참조하십시오.

+0

감사! 그것은 효과가 있었지만 몇 가지 변화가 필요했습니다. 1. 첫째, 내 프로젝트 유형이 Qt GUI 응용 프로그램이므로 주어진 QGraphicsView를 내 자신의 것으로 대체해야했습니다. 저는 .ui 파일을 수동으로 편집하고 객체의 클래스 이름을 바꾸어서이 작업을 수행했습니다. 2. QGraphicsView 서브 클래 싱에 대해 다음 예제를 사용했습니다. http://doc.trolltech.com/4.3/graphicsview-elasticnodes.html. 상위 위젯에 대한 매개 변수를 포함하도록 생성자를 수정해야했습니다. GraphWidget (QWidget * parent) [...]. 그런 다음이 클래스에서 상황에 맞는 메뉴 이벤트를 구현하는 것이 트릭을 만들었습니다. – TudorT

+0

수동으로 .ui 파일을 수동으로 수정하지 않아도 다르게 할 수 있습니까? – TudorT

+0

위젯의 컨텍스트 메뉴에서 "to promote ..."액션을 사용하여 QtCreator의 디자인 뷰에서 위젯 클래스를 QGraphicsView에서 자신의 클래스로 변경할 수 있습니다. –

7

당신은 당신이 장면에 대한 액세스를 제공합니다 QGraphicsScene 클래스의 contextMenuEvent 방법 좌표뿐만 아니라 (또한 작동하지만이 정보가없는 QGraphicsView, 반대) 화면 좌표를 다시 구현할 수 있습니다 :

void YourGraphicsScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) 
{ 
    // event->scenePos() is available 
    QMenu menu(this); 
    menu.addAction(...); 
    menu.addAction(...); 
    ... 
    menu.exec(event->screenPos()); 
} 
+1

이것은 좋은 해결책입니다. QMenu 메뉴 (this); 작동하지 않습니다. QMenu 메뉴를 사용할 수 있습니다 (event-> widget()); 활성화 된 위젯이 QMenu의 QWidget 부모 역할을하도록합니다. – gamecreature

+1

사실, 메뉴를 부모에게 줄 필요가없는 것 같습니다. QMenu 메뉴()는 상황에 맞는 메뉴가 그 자체의 창이고 화면 좌표에 배치되기 때문에 정상적으로 작동합니다. –

관련 문제