2012-05-26 28 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

ウィジェットのコンテキストメニューの "promote to ..."アクションを使用して、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

これは良い解決策です。 Qメニューメニュー(これ)。動作しません。 QMenuメニュー(event-> widget())を使うことができます。アクティブなウィジェットをQMenuのQWidget親として機能させる。 – gamecreature

+1

実際には、メニューを親にする必要はありません。 QMenuメニュー()はうまく動作します。コンテキストメニューはそれ自体のウィンドウであり、画面座標に配置されているからです。 –

関連する問題