55870


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
            self.x_ini=0
            self.x_fin=2*np.pi
    
            fig = Figure(figsize=(width, height), dpi=dpi)
            self.axes = fig.add_subplot(111)
    
            FigureCanvas.__init__(self, fig)
            self.setParent(parent)
    
            self.plot_figure3(self.x_ini,self.x_fin)
    
    
        def wheelEvent(self,event):
            self.set_range()
            self.plot_figure3(self.x_ini,self.x_fin)
    
    
        def set_range(self):
            diff=self.x_fin-self.x_ini
            center=(self.x_ini+self.x_fin)/2
            self.x_ini=center-diff*1.1
            self.x_fin=center+diff*1.1
    
    
    
    class MyStaticMplCanvas(MyCanvas):
        def __init__(self, parent=None):
            super(MyStaticMplCanvas,self).__init__(parent)
            self.setFocusPolicy(Qt.StrongFocus)
            self.setAcceptDrops(True)
    
    
        def plot_figure3(self,x_ini,x_fin):
            #x=np.arange(0,2*np.pi,0.1)
            x=np.linspace(x_ini,x_fin,1000)
            y=np.cos(x)
            self.axes.clear()
            self.axes.plot(x,y,"-")
            self.axes.set_xlabel("x")
            self.axes.set_ylabel("y")    
            self.axes.set_xlim(x_ini,x_fin)
            self.draw()
    
    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_()
    
[/code]

これを実行すると次のようなGUIが作成されます。  
[![画像](https://i.stack.imgur.com/zemHB.png)](https://i.stack.imgur.com/zemHB.png)  
ここで、グラフ上でマウスホイールを回すとグラフのx方向の表示範囲が大きくなります。しかし、今のままでは描写範囲が大きくなるばかりで小さくなることはありません。マウスホイールの回転方向を判別できれば解決できそうなのですが、その方法が分かりません。どなたかご教授お願いします。


CC BY-SA 4.0
2019-06-17T02:15:06.830
55863
2019-06-17T04:21:56.880
26529
question
python3 pyqt5
pyqt5でマウスホイールの回す方向を判別したい


通知された`QWheelEvent`の`angleDelta()`の`y()`で方向と角度が分かります。

[QPoint QWheelEvent::angleDelta()
const](https://doc.qt.io/qt-5/qwheelevent.html#angleDelta)

> Returns the distance that the wheel is rotated, in eighths of a degree.  
>  A positive value indicates that the wheel was rotated forwards away from
> the user;  
>  a negative value indicates that the wheel was rotated backwards toward the
> user.  
>  Most mouse types work in steps of 15 degrees, in which case the delta value
> is a multiple of 120;  
>  i.e., 120 units * 1/8 = 15 degrees.
>
> ホイールの回転距離を8分の1度単位で返します。  
>  正の値は、ホイールがユーザーから離れる方向に回転したことを示します。  
>  負の値は、ホイールがユーザーに戻る方向に回転したことを示します。  
>  ほとんどのマウスタイプは15度のステップで動作します。その場合、デルタ値は120の倍数です。  
>  １２０単位 × １／８ ＝ １５度。

[int QPoint::y() const](https://doc.qt.io/qt-5/qpoint.html#y)

> Returns the y coordinate of this point.
>
> この点のy座標を返します。

単純に正負の判定だけで処理すれば、以下のようになります。  
始点は 0 から動かさない形に変えました。

[code]

        def wheelEvent(self,event):
            self.set_range(event.angleDelta().y())
            self.plot_figure3(self.x_ini,self.x_fin)
    
        def set_range(self,angleDeltaY):
            diff=self.x_fin-self.x_ini
            if angleDeltaY > 0:
                self.x_fin=self.x_ini+diff*0.9  # 前方向 ズームイン
            else:
                self.x_fin=self.x_ini+diff*1.1  # 後方向 ズームアウト
    
[/code]


CC BY-SA 4.0
2019-06-17T04:21:56.880
55870
2019-06-17T04:21:56.880
26370
55863
answer