pyqt5でマウスプレスイベントが思うように動作しない
pyqt5でグラフ上をクリックしたときに座標が表示されるGUIは次のように書けます。
import sys
from PyQt5 import QtGui,QtCore, QtWidgets,QtMultimedia, QtMultimediaWidgets
from PyQt5.QtWidgets import QDialog, QApplication, QVBoxLayout
from PyQt5.QtCore import Qt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import numpy as np
class MyCanvas(FigureCanvas):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
self.plot_figure()
FigureCanvas.__init__(self, fig)
self.setParent(parent)
class MyStaticMplCanvas(MyCanvas):
def plot_figure(self):
x=np.arange(0,2*np.pi,0.1)
y=np.sin(x)
self.axes.plot(x,y,"-")
self.axes.set_xlabel("x")
self.axes.set_ylabel("y")
self.axes.set_xlim(0,2*np.pi)
class Main(QDialog):
def __init__(self, parent=None):
super(Main, self).__init__(parent)
#canvas = MyCanvas(self)
canvas = MyStaticMplCanvas(self)
canvas.mpl_connect('button_press_event', self.mousePressEvent)
layout = QVBoxLayout()
layout.addWidget(canvas)
self.setLayout(layout)
self.setWindowTitle('plot')
self.show()
def mousePressEvent(self,event):
print(event.xdata)
print(event.ydata)
#print(event.x)
#print(dir(event))
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Main()
app.exec_()
ここで、マウスプレスイベントの関数をMycanvasクラス内に移動させようとしました。そのように書き直したコードが次です。
import sys
from PyQt5 import QtGui,QtCore, QtWidgets,QtMultimedia, QtMultimediaWidgets
from PyQt5.QtWidgets import QDialog, QApplication, QVBoxLayout
from PyQt5.QtCore import Qt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import numpy as np
class MyCanvas(FigureCanvas):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
self.plot_figure()
FigureCanvas.__init__(self, fig)
self.setParent(parent)
def mousePressEvent(self,event):
#print("l")
if event.button() == Qt.LeftButton:
print(event.xdata)
print(event.ydata)
elif event.button() == Qt.RightButton:
print("L")
class MyStaticMplCanvas(MyCanvas):
def plot_figure(self):
x=np.arange(0,2*np.pi,0.1)
y=np.sin(x)
self.axes.plot(x,y,"-")
self.axes.set_xlabel("x")
self.axes.set_ylabel("y")
self.axes.set_xlim(0,2*np.pi)
class Main(QDialog):
def __init__(self, parent=None):
super(Main, self).__init__(parent)
#canvas = MyCanvas(self)
canvas = MyStaticMplCanvas(self)
layout = QVBoxLayout()
layout.addWidget(canvas)
self.setLayout(layout)
self.setWindowTitle('plot')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Main()
app.exec_()
しかし、この後者のコードではグラフ上をクリックしても何も起こりませんでした。エラーすら吐きませんでした。どこが悪かったのでしょうか。