PyQt5とPythonでサブウィンドウを出してみる


[前回の記事](http://qiita.com/hnkz/items/a8311aeba1682debebf7)に引き続きPyQt5で遊びます。

今回はサブウィンドウを出してみる

## まずは普通にサブウィンドウを出力

```python:test.py
#!/usr/bin/env python3

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        # ボタンの作成
        makeWindowButton = QPushButton("&make window")
        # クリックイベント(makeWindow())の追加
        makeWindowButton.clicked.connect(self.makeWindow)
        # レイアウトの作成
        layout = QHBoxLayout()
        # レイアウトにボタンの追加
        layout.addWidget(makeWindowButton)
        # ウィンドウにレイアウトを追加
        self.setLayout(layout)

    def makeWindow(self):
        # サブウィンドウの作成
        subWindow = SubWindow()
        # サブウィンドウの表示
        subWindow.show()

class SubWindow(QWidget):
    def __init__(self, parent=None):
        # こいつがサブウィンドウの実体？的な。ダイアログ
        self.w = QDialog(parent)
        label = QLabel()
        label.setText('Sub Window')
        layout = QHBoxLayout()
        layout.addWidget(label)
        self.w.setLayout(layout)

    def show(self):
        self.w.exec_()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    main_window = MainWindow()

    main_window.show()
    sys.exit(app.exec_())
```

親のウィンドウでサブウィンドウのクラスをインスタンス化して、show()してあげるとサブウィンドウができちゃいます。

`self.w = QDialog(parent)`
ここらへん、大事。

これをせずに、サブウィンドウクラスで
`self.setLayout(layout)`
とやってもエラーが起きちゃうので、だめ。

## 呼び出し元クラスと値の受け渡しを行うサブウィンドウの出力

サブウィンドウを出力して、パラメータを入力する、みたいな状況、多分ありますよね。
やってみます。

```python:test.py
#!/usr/bin/env python3

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        makeWindowButton = QPushButton("&make window")
        makeWindowButton.clicked.connect(self.makeWindow)

        self.label = QLabel()
        self.label.setText("default:")

        layout = QHBoxLayout()
        layout.addWidget(makeWindowButton)
        layout.addWidget(self.label)
        self.setLayout(layout)

    def makeWindow(self):
        subWindow = SubWindow(self)
        subWindow.show()

    # サブウィンドウから実行
    def setParam(self, param):
        self.label.setText(param)

class SubWindow:
    def __init__(self, parent=None):
        self.w = QDialog(parent)
        self.parent = parent

        label = QLabel()
        label.setText('Sub Window')

        self.edit = QLineEdit()

        button = QPushButton('送信')
        button.clicked.connect(self.setParamOriginal)

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

        self.w.setLayout(layout)

    # ここで親ウィンドウに値を渡している
    def setParamOriginal(self):
        self.parent.setParam(self.edit.text())

    def show(self):
        self.w.exec_()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    main_window = MainWindow()

    main_window.show()
    sys.exit(app.exec_())
```

サブウィンドウから親ウィンドウのラベルに値を入れ込んであげてる。
Python初めて4日なのとPythonの言語についての勉強はほとんどしてなくて、selfの扱い方がわからずに少し詰まった。コード汚くてごめんなさい。


## 感想・考察
PyQtほんとすごい、すごい、、、、とても便利だなと思いました。
リファレンス読もうとするんだけど、英語力の無さとPythonにまだ慣れてなくて、ろくに読めない。
もう少しPythonになれなきゃなぁ。。。

## 最後に
コード汚くてほんと御免なさい、、、、、