Maya PySide2 / PySide チュートリアル 初学編 ④ – 閉じるボタンを作る

python,qt,PySide,PySide2,Tutorial

このチュートリアルは閉じるボタンがあるウィンドウの作り方と注意点を学んでいきます
この閉じるボタンにもよくチュートリアルでは使われますがMayaなどのツールでそのまま実行するとMayaが落ちてしまうという罠があります
それについても解説していきます

import sys

try:
    from PySide2.QtWidgets import *
    from PySide2.QtCore import *
except ImportError:
    from PySide.QtGui import *
    from PySide.QtCore import *


class Example(QWidget):
    def __init__(self, parent=None, *args, **kwargs):
        super(Example, self).__init__(parent, *args, **kwargs)

        self.initUI()

    def initUI(self):
        # self.resize(400, 270)
        # self.move(500, 300)
        self.setGeometry(500, 300, 400, 270)
        self.setWindowTitle("Close button")

        button = QPushButton("close", self)
        button.move(150, 70)
        # button.clicked.connect(QCoreApplication.instance().quit)
        button.clicked.connect(self.close)


def main():
    app = QApplication.instance()
    ex = Example()
    ex.show()
    sys.exit()
    app.exec_()


main()

クラスに関して

前回と違い今回はクラスで実行していますというのもPySideは基本的にクラスを使ってUIを構築していきます
なのでこれからはクラスを使ったチュートリアルになります
ここが初心者には難しいと言われているというところなのかもしれませんが
あまり身構える必要はありません

クラスを使ったこともない人に上のコードのざっくり説明すると

class Example(QWidget):
    def __init__(self, parent=None, *args, **kwargs):
        self.initUI()
    def initUI(self):

class Example(QWidget):でExampleというクラスを定義しています
このExampleはQWidgetというクラスを継承しています
継承というのは言葉の通り、QWidgetというクラスを引き継ぎ、新たにExampleというクラスを作っています
そしてクラスの中にクラス内関数と呼ばれる__init__initUIが定義されていますが
これを説明する前にselfというものを説明する必要があります
selfはクラス自身つまりExampleというクラスになります
つまりself.initUI()Example().initUI()呼び出しますよと定義しているようなものです

ではクラス内関数を説明していきます
def __init__(self, parent=None, *args, **kwargs):は必ず最初に呼び出される特殊な関数を定義しています
initとは初期化という意味がありdef initUI(self):は初期化時のUIを定義したいために作ったものです
__init__内に直接定義していないのは煩雑になると読みづらいから外に出したというようなイメージです

ざっくりとした説明ですがクラスに関して詳しく知りたい場合はPythonのドキュメントやクラスに関して説明してくださっているサイト、ブログなどをお読みください

PySideに関して

initUIには様々なことが定義されています

# self.resize(400, 270)
# self.move(500, 300)
self.setGeometry(500, 300, 400, 270)

setGeometry(int x, int y, int w, int h)は、移動イベント(move(500, 300))やリサイズイベント(resize(400, 270))を同時に行うことができます

button = QPushButton("close", self)
button.move(150, 70)

QPushButton(const QString &text, QWidget *parent = nullptr)はコマンドボタンを提供します。
QPushButtonを表示した後、moveでポジションの移動を行っています

# button.clicked.connect(QCoreApplication.instance().quit)
button.clicked.connect(self.close)

シグナルとスロット

Qtの機能で重要なシグナルとスロットを定義しています
この機能は、基本的にはウィジェット同士やウィジェットと独自のPythonコードの間の通信を可能にするために使用することができます
今回はボタンを押すとウインドウが閉じるようにしています
# button.clicked.connect(QCoreApplication.instance().quit)とハイドしているコードがあります
これはよくチュートリアルなどで使用されているウインドウを閉じるコードですが、しかしこれを行うとMayaが終了しますのでMayaで行う場合は何かしら書き換えないと意図せずmayaを終了させてしまいます
20210819_01

なのでMayaでウィンドウを閉じる場合はself.closeなどに書き換えて実行したりすると意図せずmayaを終了させなくてすみます

Maya PySide2 / PySide チュートリアルのこのパートでは、閉じるボタンがあるウィンドウの作り方と注意点を学び、ウィジェット、プッシュボタン、シグナルとスロットを扱いました

次はMaya PySide2 / PySide チュートリアル 初学編 ⑤
前はMaya PySide2 / PySide チュートリアル 初学編 ③