画像のビューアを作る 2

190618

とりあえず作ってみた

  • designer を使わないとさっとは書けない
    サンプルがあったのでそれを使い回した感じ
import sys , glob ,os
from PyQt5.QtWidgets import QApplication, QWidget, QLabel,QVBoxLayout
from PyQt5.QtGui import QPixmap
from PyQt5.QtSvg import QSvgRenderer,QSvgWidget

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.setAcceptDrops(True)
        self.title = 'PyQt Viewer'
        self.pics=[]
        self.current={'index':0, 'picslen':0}
        self.setWindowTitle(self.title)

        self.__lyt = QVBoxLayout()
        self.__lyt.setContentsMargins(0, 0, 0, 0)
        self.__lyt.setSpacing(0)
        self.setLayout(self.__lyt)

        self.label = QLabel(self)
        self.__lyt.addWidget(self.label)

        pixmap = QPixmap(<pass>)
        self.label.setPixmap(pixmap)
        self.resize(pixmap.width(),pixmap.height())
        self.show()

    def dragEnterEvent(self, e):               # これ必要 ここでacceptしてやる
        e.accept()

    def dropEvent(self, e):                    # ここで受け取る
        self.showimage(e.mimeData().text()[8:])
        self.getpictures(e.mimeData().text()[8:])

    def showimage(self,e):
        pixmap = QPixmap(e)
        self.label.setPixmap(pixmap)
        self.resize(pixmap.width(),pixmap.height())
        self.show()

    def getpictures(self,e):
        ext=['jpg','jpeg','png','gif']
        for f in ext :
            self.pics += glob.glob( os.path.join( os.path.split(e)[0] , '*.'+ f ))
            self.pics.sort()
        # print( self.pics )
        self.current['picslen']=len(self.pics)
        try:
            self.current['index']=self.pics.index(e)
        except:
            self.current['index']=0
    
    def wheelEvent (self, e):#  mousewheel 引いたら-yが128
        # print( e.angleDelta().x() ,e.angleDelta().y()   ) # mouseWheel
        # print(self.pics[0])
        if e.angleDelta().y() < 0 : # increase
            self.current['index'] +=1
            if self.current['index'] > self.current['picslen'] -1 :
                self.current['index']=0
        else:
            self.current['index'] -=1
            if self.current['index'] < 0 :
                self.current['index']=self.current['picslen']-1
        self.showimage(self.pics[self.current['index'] ])

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    # ex.show()
    sys.exit(app.exec_())
  • 何とか表示できたが、まだウインドウのサイズ調整がうまくいかない
    大きくなった後小さいファイルを表示しても戻らないことがある

  • ドラッグで開くのが基本
    表示処理の後すぐフォルダをglobでスキャンして画像ファイルをリスト化して、マウスのホイールで表示ファイルを切り替えるようにした。これが基本の動作
    リストは拡張子毎にglobを回してリストに加えていって、最後にソートした

  • ちなみにドロップされたファイルをリストから検索してそのインデクスをカレントにしておく必要があるが、検索結果はエラー。対策必要

  • ホイール
    マウスホイールは wheelイベントとして QWidget に実装されてます
    このイベントをクラス内で def すると、QWheelEvent Class が引数で来る
    ここから angleDelta().y() を取り出して、マイナスなら普通の手前のホイール、プラスなら逆のホイールと判断する
    ホイールに応じて画像リストのインデクスをインクリ・デクリメントしてやれば良い

  • ちなみにこれはQt5の仕様で、Qt4は少し違うので注意
    angleDelta() はposを返すので当然 x()も取得できるが、常に0だった
    Qt4だと単にDelta()となっていて、これはintしか返さないから拡張したんだと思う
    いずれ x() も何らかの値を返すようになるんだと思う

  • とりあえず表示は出来たけど次は何の機能をつけよう
    zip内のファイルが読めなければ意味ないからそこかな
    zipモジュールを使うか自分でヘッダ解析をするかどうしよう?

  • 現状だとzip化したjpgは読めなかった
    しかしエラーになるわけでは無いので、pixmap(file) は失敗してもエラーは返さなってことだね

戻る

END

Close