2016-07-25 6 views
1

Ich habe Probleme mit der Kontextmenüposition in VTK mit PyQt. Das Haupt GUI-Fenster hat die VTK-Widget als zentrales Widget gesetzt:Python VTK Kontextmenü nicht an der Mausposition

from vtk_widget.vtk_widget import VTKWidget 

class DySMainWindow(QtGui.QMainWindow): 
    def __init__(self): 

     self.vtk_widget = VTKWidget(self) 
     self.setCentralWidget(self.vtk_widget) 

und die VTK widget ist:

import vtk 
from vtk.qt4.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor 
from PyQt4 import QtGui, QtCore, Qt 


class VTKWidget(QVTKRenderWindowInteractor): 
    def __init__(self, MBD_system=None, parent=None): 
     super(VTKWidget, self).__init__(parent) 
     # this should show context menu 
     self.AddObserver("RightButtonPressEvent", self.contextMenu) 

     self.renderer = vtk.vtkRenderer() 
     self.GetRenderWindow().AddRenderer(self.renderer) 

     self.interactor = self.GetRenderWindow().GetInteractor() 
     self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera()) 

     # camera object 
     self.camera = self.renderer.GetActiveCamera() 
     if self.projection == 'perspective': 
      self.camera.ParallelProjectionOff() 
     else: 
      self.camera.ParallelProjectionOn() 

     self.renderer.SetActiveCamera(self.camera) 
     self.renderer.ResetCamera() 
     self.renderer.SetBackground(0, 0, 0) 
     self.interactor.Initialize() 

    def contextMenu(self, caller, event): 
     pos = self.interactor.GetEventPosition() 

     menu = QtGui.QMenu(parent=self) 
     menu.addAction(self.tr("Edit object")) 

     menu.exec_(self.mapToGlobal(QtCore.QPoint(pos[0], pos[1]))) 

Jede Hilfe dieser Lösung würde geschätzt.

Antwort

2

Die contextmeny-Ereignismethode verwendet einen Punkt als Eingabe. Wenn wir davon ausgehen, dass Ihr Menü qMenuVTK aufgerufen wird und Sie ein übergeordnetes Fenster haben, sollten folgende Arbeiten:

In Ihrem rightbuttonpressevent fügen Sie folgendes:

self.parent.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 
self.parent.customContextMenuRequested.connect(self.onContextMenu) 

Und die Methode Ereignis wird wie folgt aussehen:

def onContextMenu(self, point): 
    self.qMenuVTK.exec_(self.parent.mapToGlobal(point)) 
+0

Ich löste es mit einem etwas anderen Ansatz, aber deiner ist besser (mein hatte ein Problem mit der Mausinteraktion). – avstenit

Verwandte Themen