2016-07-25 11 views
1

У меня возникают проблемы с позицией контекстного меню в VTK с PyQt. В главном окне графического интерфейса установлен виджет VTK как центральный виджет:Контекстное меню python VTK не в позиции мыши

from vtk_widget.vtk_widget import VTKWidget 

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

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

и VTK widget является:

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]))) 

Любой помощи в решении этого будет оценен.

ответ

2

Метод события contextmeny принимает точку ввода. Если мы предположим, что в меню называется qMenuVTK и у Вас есть родительское окно, следующее должно работать:

В вашем rightbuttonpressevent добавить следующее:

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

И событие метод будет выглядеть следующим образом:

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

Я решил это с помощью немного другого подхода, но ваш лучше (у меня была одна проблема с взаимодействием с мышью). – avstenit