ON-BLOG

CGのこと、あれこれ書いてます。

Pyside勉強 その参

次は
Pysideの肝になる継承を含んだ例です。
こちらも前前回の記事に載っているものですね。

#-'''- coding: utf-8 -'''-
from PySide.QtCore import *
from PySide.QtGui import *

class Form(QDialog):

    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        self.edit = QLineEdit("Your Name???")
        self.button = QPushButton("Push!!!")
        layout = QVBoxLayout()
        layout.addWidget(self.edit)
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.button.clicked.connect(self.greetings)

    def greetings(self):
        print ("Hello", self.edit.text())

if __name__ == '__main__':
    form = Form()
    form.show()

起動するとこんな感じに
f:id:tommy_on:20190415231745p:plain
UIに文字を入力すると
入力した値が出力されるといった簡単なものです。
f:id:tommy_on:20190415232037p:plain
なんか返って来てますね。

では解説を…

class Form(QDialog):

クラスを定義しています。
クラスの説明はややこしそうなので、簡単に雛形として
処理をまとめたりできるもの。として認識してくれればと思います。
Class この部分でクラスを定義しています。
関数だとDefですね。
その後の文字列【Form】がクラス名です。
名前は予約語以外ならなんでもいいです。
(QDialog)この部分が肝です。
クラスを定義する際に、括弧内に入れるものはPysideの場合は
継承をうまい事使ってGUIを構築していきます。
今回の件でいうと、Pysideの【QDialog】(文字入力させたりメッセージ確認等を行う、一時的に開かれるウィンドウのことです。)
を継承しますよ。そして、色々カスタマイズしますよ!と宣言しています。

ちなみに、QDialogの親元はQWidgetでまたその親がQObjectになります。
こういう親子関係がベースになりますので結構重要です。
https://blog.qt.io/jp/2010/05/05/object/Qt をはじめよう! 第7回: Qt のオブジェクトモデルを理解しよう - Qt Japanese Blog
私はここではじめ学んだ気がします。
あとこの図も
http://www.ibe.kagoshima-u.ac.jp/edu/gengo2j/p8/hume.png


ちなみに、PySideは以下の構造になっています。
※一部抜粋
[Qt QObject]
>[Qt QLayout]
>>[Qt QBoxLayout]
>>[Qt QGridLayout]
>[Qt QWidget]
>>[Qt QDialog]
>>[Qt QLineEdit]


では続けて

 def __init__(self, parent=None):
	super(Form, self).__init__(parent)

クラス内の一番初めの2行です。
関数が記載されています。

この関数は __init__となってます。initializeの略ですが、Pythonでは
ダブルアンダースコアで括るルールがあるみたいです。
この処理自体は、クラスを実体化させる、コンストラクタになるのですが
意味合い的には、クラスの情報を初めに定義する。
という意味があり、実際クラスを実行すると
この関数が初めに実行されます。


括弧内ですが、self、parent=Noneとなってますね。
selfは言葉通り、自身。Formクラスのことを示しています。
class Form(QDialogを継承したクラスForm)を初期化しますよ。という意味です。
parent=Noneの意味は、引数parentのデフォルト値がNoneという意味になります。
そもそもこのオブジェクト(クラス)自身、新規のオブジェクトなので
当たり前ですが、親がいません。
なので、継承元のQDialogのコンストラク
QDialogの__init__(None)を実行する。という意味になります。

ちなみに【parent】は実はクラス継承とは関係がないみたいで
単純にオブジェクト間の親子関係を表すみたいです。
要はparent引数をNoneにした場合、QDialogが親で
【新規のオブジェクトを作成】ということになります。
※このあたり自信がないので、間違っていたら
 ご指摘いただけますと、嬉しいです。

●次の行

super(Form, self).__init__(parent)

こちらは上記の続きになります。
super() は親クラスを示すためのメソッドです。
__init__() メソッドは親クラスでも、子クラスでも定義されています。
このような場合、子クラスが初期化が有線されて上書きされます。
これをオーバーライドと言います。
親クラスのメソッドや変数を呼んだり参照したいケースでsuper()を使用します。

では中身をみてみます。superのプロパティですが以下のようになります。
super(クラス, インスタンス).メソッド
詳しくは以下のサイトを…
www.lifewithpython.com


なので、置き換えると
クラスFormの親【QDialog】の初期化を実行します。
ということになり、この後に続く、QDialogに
パーツを足したりできるようになります。

長くなったので、まとめます。

def __init__(self, parent=None):
	super(Form, self).__init__(parent)

クラスFormの初期化メソッドで
スーパークラスのQDialogの初期化を実行し、QDialogに
パーツを仕込めるようにした。ということになります。

補足になりますが、クラス【Form】はサブクラスとなり
QDialogがスーパークラスになります。
※サブクラスとは、継承したクラスから新しく作ったクラスで
 継承元のクラスがスーパークラス

続き

self.edit = QLineEdit("Your Name???")
self.button = QPushButton("Push!!!")

QDialogにテキスト入力と、ボタンを追加します。
特に説明はいらないかな?括弧の中はウィンドウに表示される文字列です。

次に上記で作成した、パーツをUIの組み込みんで行きます。

layout = QVBoxLayout()
layout.addWidget(self.edit)
layout.addWidget(self.button)
self.setLayout(layout)

まずは

layout = QVBoxLayout()

QVBoxLayoutとは、Vertical(垂直)のレイアウトを作成します。
という意味で、要は縦にパーツを配置していくレイアウトを宣言しています。

layout.addWidget(self.edit)
layout.addWidget(self.button)

垂直レイアウトに上記で記載した、テキスト入力パーツとボタンを追加。
という意味になり、UIを構築している状態になります。

self.setLayout(layout)】

上記でコマンドで、UI構築を終了して確定させます。
という意味なるので、UIがこれで構築できました。

self.button.clicked.connect(self.greetings)

def greetings(self):
      print ("Hello", self.edit.text())

この部分は前も記載しましたので、軽く。
ボタンが押されたら、関数【greetings】を
実行。という意味になり、この関数は
テキスト入力されて値を表示する。
といったものになります。


以上で説明は終わりになります。
このスクリプトはPysideもしくはPythonの基本が詰まってるいいスクリプトですね。