matplotlib y Qt: mouse presione event.key siempre es Ninguno

Incrusté una figura de matplotlib en una aplicación Qt (PySide) y me gustaría responder a los eventos de clic del ratón en combinación con las teclas modificadoras (por ejemplo, cambio y control). En el código siguiente, utilicé el método canvas mpl_connect para conectar ‘button_press_event’ a un controlador ficticio que imprime el valor de event.key. Este valor siempre es ‘Ninguno’, incluso si presiono una tecla modificadora durante el clic del mouse. ¿Cómo puedo obtener el estado de las teclas modificadoras en un controlador de eventos del mouse matplotlib cuando incrusté una figura matplotlib en una aplicación Qt?

Gracias.

import sys from PySide import QtGui, QtCore from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure class MplCanvas(FigureCanvas): """Class to represent the FigureCanvas widget""" def __init__(self): self.fig = Figure() self.ax = self.fig.add_subplot(111) FigureCanvas.__init__(self, self.fig) FigureCanvas.setSizePolicy(self, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) FigureCanvas.updateGeometry(self) self.fig.canvas.mpl_connect('button_press_event',self._on_press) def _on_press(self,event): print( event.key ) class MplWidget(QtGui.QWidget): """Widget defined in Qt Designer""" def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) self.canvas = MplCanvas() self.vbl = QtGui.QVBoxLayout() self.vbl.addWidget(self.canvas) self.setLayout(self.vbl) class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtGui.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget) self.verticalLayout.setObjectName("verticalLayout") self.mpl = MplWidget(self.centralwidget) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.mpl.sizePolicy().hasHeightForWidth()) self.mpl.setSizePolicy(sizePolicy) self.mpl.setObjectName("mpl") self.verticalLayout.addWidget(self.mpl) MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtGui.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) class DesignerMainWindow(QtGui.QMainWindow, Ui_MainWindow): """Customization for Qt Designer created window""" def __init__(self, parent = None): super(DesignerMainWindow, self).__init__(parent) # setup the GUI --> function generated by pyuic4 self.setupUi(self) if __name__ == '__main__': # create the GUI application app = QtGui.QApplication(sys.argv) # instantiate the main window dmw = DesignerMainWindow() # show it dmw.show() # start the Qt main loop execution, exiting from this script # with the same return code of Qt application sys.exit(app.exec_()) 

Solución, proporcionada por OP, editada fuera de la respuesta:

Acabo de encontrar la respuesta a mi pregunta aquí .
El problema es que los eventos de pulsación de teclas en general no se procesan a menos que “active el foco de qt en su canvas de mpl”. La solución es agregar dos líneas a la clase MplWidget:

 class MplWidget(QtGui.QWidget): """Widget defined in Qt Designer""" def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) self.canvas = MplCanvas() #THESE TWO LINES WERE ADDED self.canvas.setFocusPolicy( QtCore.Qt.ClickFocus ) self.canvas.setFocus() self.vbl = QtGui.QVBoxLayout() self.vbl.addWidget(self.canvas) self.setLayout(self.vbl) 

event.key se usa al conectar key_press_event , aquí es posible que event.button==1 revisar event.button==1 (o 2, etc.)