Hello PySide World

面倒で放置してますが、2年くらい前からPySideを覚えたいなーと思っていました。昔少し触ってたんですけど綺麗に忘れていて、やっぱり記事書きながら覚えていこうと思います。

まずインストール。本来はPython3.x環境で使った方が良いらしいので、pipで入れようとしたのですが色々エラーになって解決出来ませんでした。まだ本気じゃないのでbrewで良しとしています。/usr/local/lib/python2.7/site-packagesにインストールされるのでパスを通しておきましょう。

$ brew install pyside

何も覚えてなかったので、チュートリアルの最初の方を見ながら、画像を読み込んで表示するだけのコードを書いてみました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
from PySide import QtCore, QtGui

class ImageViewer(QtGui.QWidget):
    def __init__(self):
        super(ImageViewer, self).__init__()
        self.setWindowTitle('ImageViewer')

        self.imageLabel = QtGui.QLabel()
        self.imageLabel.setBackgroundRole(QtGui.QPalette.Base)
        self.filenameLabel = QtGui.QLabel()
        self.button = QtGui.QPushButton('open')
        self.button.clicked.connect(self.open)

        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.imageLabel)
        layout.addWidget(self.filenameLabel)
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.resize(300, 300)

    def open(self):
        (path, type) = QtGui.QFileDialog.getOpenFileName(self, "Open File")
        image = QtGui.QImage(path)
        self.imageLabel.setPixmap(QtGui.QPixmap.fromImage(image).scaledToWidth(300))
        self.filenameLabel.setText(os.path.basename(path))


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    iv = ImageViewer()
    iv.show()
    sys.exit(app.exec_())

実行するとこんな感じになります。ボタンを押したらファイル選択ダイアログがでて画像を選ぶと表示される良くあるやつですね。
pyside1

処理は適当ですけど、コードが簡単だし1ファイルで完結してるしで嬉しいです。プロジェクトファイルとかイチイチ作ってられねーんだよ。カスが。細かいレイアウトとか本気でやり出したら辛い事になりそうですけど。サイズを指定以外で、座標とかの数字が出てきてないのも素敵ですね。

あと描画系のAPIを確認しとこうと、ついでに書いてみました。

pyside2

描画イベント内でグラフィックコンテキストのbegin/end間で描画命令積んで行くという、どこでも見かける感じです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from PySide import QtGui, QtCore

class Drawing(QtGui.QWidget):
    def __init__(self):
        super(Drawing, self).__init__()
        self.setWindowTitle('Drawing')
        self.resize(300, 300)

    def paintEvent(self, e):

        ctx = QtGui.QPainter()
        ctx.begin(self)

        ctx.setPen(QtGui.QColor(168, 34, 3))
        ctx.drawText(e.rect(), QtCore.Qt.AlignCenter, u'日本語')
        
        ctx.setPen(QtCore.Qt.red)
        ctx.drawPoint(100, 100)
        
        ctx.setBrush(QtCore.Qt.blue)
        ctx.drawRect(10, 10, 50, 50)

        mybrush = QtGui.QBrush(QtCore.Qt.Dense3Pattern)
        ctx.setBrush(mybrush)
        ctx.drawRect(70, 10, 50, 50)

        pen = QtGui.QPen(QtCore.Qt.black, 2, QtCore.Qt.DashLine)
        ctx.setPen(pen)
        ctx.drawLine(20, 80, 250, 250)

        path = QtGui.QPainterPath()
        path.addRoundRect(QtCore.QRectF(130, 10, 50, 50), 20)
        ctx.drawPath(path)

        ctx.end()


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    drawing = Drawing()
    drawing.show()
    sys.exit(app.exec_())

なんとかサンプルくらいなら作り始められそうです。

まだ詰まるような事も何もしてないのですが、学習初期の情報源としては、この公式サンプル群が役に立ちそうです。Qtのサンプル群をPySideにポートしたもののようです。

まだ全然把握出来てないのですけど、手元でちょっとした実験に使うにはもってこいの環境っぽいですね。

Leave a Reply

Your email address will not be published. Required fields are marked *