Pythonで作るシンプル画像ビューワ
2020/03/02 categories:PyQt5| tags:Python|PyQt5|Python|TOOL|
概要
画像をドラックアンドドロップすると表示するだけのソフトです。マウスホイールでズーム、マウス左クリックでドラッグするとパンできます。
ダウンロード
NuitkaでWindows用にコンパイルしたデータです
ソースコード
バグ
どんなファイルでもDDできてしまう
課題
- 回転機能を追加する
- ウィンドウフレームの表示、非表示が出来るようにする
その他
PyQt5で画像を扱う練習のために作りました。シンプルと言いつつNuitkaでコンパイルした実行ファイルは起動に数秒程度の時間がかかるので使いたくないレベルです。Pythonのスクリプトを実行すると起動が早いので、スクリプトのままなら使ってもいいかなと思います。
ズームイン、ズームアウトの機能は下記リンクの内容参考に、スムーズなズームが出来るようにしています。
上記をPythonに書き換えてMainwindowクラスには下記のようなメソッドを実装しました。
def wheelEvent(self, event):
numDegrees = event.angleDelta().y() / 8
numSteps = numDegrees / 15
self._numScheduledScalings += numSteps
if self._numScheduledScalings * numSteps < 0:
self._numScheduledScalings = numSteps
anim = QtCore.QTimeLine(350, self)
anim.setUpdateInterval(20)
anim.valueChanged.connect(self.scalingTime)
anim.finished.connect(self.animFinished)
anim.start()
def scalingTime(self, x):
factor = 1.0 + float(self._numScheduledScalings) / 300.0
self.ui.graphicsView.scale(factor, factor)
def animFinished(self):
if self._numScheduledScalings > 0:
self._numScheduledScalings -= 1
else:
self._numScheduledScalings += 1
マウスホイールが動いたときにwheelEventが呼び出されるので、Mainwindowのコンストラクタで下記のようにオーバーライドしています。
self.ui.graphicsView.wheelEvent = self.wheelEvent
中身はSmooth Zoom In QGraphicsViewに書いている通りですが、350msecで終了するQTimeLineを作成して、20msecごとにscalingTimeを呼び出します。scalingTimeではホイール移動量の勢いを計算して、ビューのスケールにセットしています。
動かしてみると割とスムーズに動いている感じがします。