55021


pyqt5でグラフを描いた時に、特定のキーを押したときにアクションを起こすようにしたいです。下は試しに書いてみたコードです。

[code]

    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)
    
            #FigureCanvas.setSizePolicy(self,QtWidgets.QSizePolicy.Expanding,QtWidgets.QSizePolicy.Expanding)
            #FigureCanvas.updateGeometry(self)
    
        def plot_figure(self):
            pass
    
        def keyPressEvent(self,event):
            if event.key() == Qt.Key_Right:
                print("g")
            else:
                print("G")
    
    
    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 = 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_()
    
[/code]

これを実行すると次のようなGUIが作成されます。  
[![画像](https://i.stack.imgur.com/Pge8q.png)](https://i.stack.imgur.com/Pge8q.png)  
ここで右矢印キーを押したときに「ｇ」とプリントされるように書いてみたつもりですが、実際はキーを押しても何も反応しません。特にエラーは吐いていません。どのように直せばよいのでしょうか。


CC BY-SA 4.0
2019-05-16T11:52:17.810
55018
2019-05-17T06:47:14.167
26529
question
python3 pyqt5
pyqt5でkeyPressEventがうまくいかない


デフォルト状態の時：  
[How PyQt5 keyPressEvent works](https://stackoverflow.com/q/45308101/9014308)

`def keyPressEvent(self,event):` の処理を `class Main(QDialog):` の方に移動してください。

* * *

特定の部品でのみ処理したい時：  
[keyPressEvent no reaction](https://stackoverflow.com/q/22169216/9014308)  
[PyQt5 processes MousePressEvent but not KeyPressEvent
[duplicate]](https://stackoverflow.com/q/50804987/9014308)

> したがって、`self.setFocusPolicy(Qt.StrongFocus)`という行を使用してフォーカスポリシーを追加すると問題が解決します。

該当部品(質問の場合は`class
MyCanvas(FigureCanvas):`)の`__init__`等に`self.setFocusPolicy(Qt.StrongFocus)`を追加してください。

* * *

いずれも文字はコンソールの方に出ます。


CC BY-SA 4.0
2019-05-16T12:17:34.080
55021
2019-05-16T13:12:54.750
2019-05-16T13:12:54.750
26370
26370
55018
answer


修正したコードです

[code]

    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)
    
            #FigureCanvas.setSizePolicy(self,QtWidgets.QSizePolicy.Expanding,QtWidgets.QSizePolicy.Expanding)
            #FigureCanvas.updateGeometry(self)
    
        def plot_figure(self):
            pass
    
        def keyPressEvent(self,event):
            if event.key() == Qt.Key_Right:
                print("g")
            else:
                print("G")
    
    
    class MyStaticMplCanvas(MyCanvas):
        def __init__(self, parent=None):
            super(MyStaticMplCanvas,self).__init__(parent)
            self.setFocusPolicy(Qt.StrongFocus)
    
        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 = 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_()
    
[/code]


CC BY-SA 4.0
2019-05-17T06:47:14.167
55040
2019-05-17T06:47:14.167
26529
55018
answer