0

私は古典的な QgraphicsView / QGraphicsScene / QGraphicsItem フレームワークで作業しています。QgraphicsView でコンテキスト メニューを宣言しています。

    self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
    self.customContextMenuRequested.connect(self.__contextMenu)

そして後で:

# ---------------------------------------------------------------------------
def __contextMenu(self, position):
  """ """
  # ----> Creating Context menu -----------------------------------
  oTreeMenu = QtGui.QMenu()

  etc ...

次に、QGraphicsItem インスタンス化クラスで、次のように contextMenuEvent を使用します。

# ---------------------------------------------------------------------------
def contextMenuEvent(self, event):
  """ """
  # ----> Creating Context menu -----------------------------------
  oTreeMenu = QtGui.QMenu()

問題は、QGraphicsItem イベントが QGraphicsView によって完全にオーバーライドされることです。両方を取得するにはどうすればよいですか?

4

2 に答える 2

0

わかりました、解決策を見つけました:

他の2つの代わりに QGraphicsScene contextMenuEvent を使用しています。イベント内で、マウスが QGraphicsItem の上にあるかどうかを確認し、対応するメニューを作成します。私のすべての関数は QGraphicsScene クラスの下にあり、それらのほとんどはシーンではなくアイテムに関係するため、このソリューションはあまり好きではありません。だからちょっと面倒ですが、うまくいきます。より良い解決策を持っている人に前もって感謝します。

于 2013-10-14T18:52:49.720 に答える
0

私はC ++でそれをやったが、それが役立つはずだと思う

GraphicsView で:

void MyGraphicsView::contextMenuEvent(QContextMenuEvent * event)
{
    QGraphicsView::contextMenuEvent(event);
    if(!event->isAccepted())
    {
        QMenu * menu  = new QMenu;
        menu->addAction("GraphicsView Action 1");
        menu->addAction("GraphicsView Action 2");
        menu->popup(event->globalPos());
    }
}

GraphicsItem で:

void MyGraphicsItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event)
{
    QMenu *menu = new QMenu;
    menu->addAction("Action 1");
    menu->addAction("Action 2");
    menu->popup(event->screenPos());
    event->setAccepted(true);
}
于 2014-09-01T10:17:06.500 に答える