PyQt5とPython3で遊んでみた


## Qtとは？
> Qt（キュート）はC++言語で書かれたアプリケーション・ユーザインタフェース (UI) フレームワークである。

> GUIツールキットとして広く知られているQtであるが、コンソールツールやサーバのような非GUIプログラムでも広く使用されている。
[Wikipediaより](https://ja.wikipedia.org/wiki/Qt)

GUIアプリケーションを簡単に作ることができるフレームワーク。クロスプラットフォーム開発にも対応してるそう。

## PyQtとは？
> PyQtは、クロスプラットフォームなGUIツールキットであるQtのPythonバインディングにして、PythonでGUIプログラミングをするときの選択肢の一つである。
[Wikipediaより](https://ja.wikipedia.org/wiki/PyQt)

Python用にセッティングされたQt、GUIアプリケーションを簡単に作ることができる。

## PyQtの利点
* 機能が豊富で、感覚的にGUIのアプリケーションを作ることができる。
* QtがPythonだけでなく、いろんな言語に対応してる、そのため他言語への移植が容易

## PyQtの問題点
* よくわからないけど、商用利用する場合にはライセンスが必要（とても高い）
* リファレンスが読みにくい（おそらく、いや間違いなく僕の読解力不足、英語力不足）

## 先ずはPyQt5を使える環境を整える

### 手順
1. Pythonをインストール
2. Qtのインストール（かなり時間かかるかも）
3. PyQtのインストール

環境設定についてはここでは解説しないので、ggrks

## 実際にコードを書いてみよう

### 先ずはWindowを出してみる


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

import sys
from PyQt5.QtWidgets import *

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


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

    main_window.show()
    sys.exit(app.exec_())
```
実行すると何もないウィンドウが出る

### ボタンとタイトルをつけてみよう

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

import sys
from PyQt5.QtWidgets import *

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

        button = QPushButton('button')

        layout = QGridLayout()
        layout.addWidget(button)
        self.setLayout(layout)
        self.setWindowTitle("Button")


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

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

ボタンとタイトルが付いた

### テキストフィールドの値を読み込んで表示してみよう

```python:input-output.py
#!/usr/bin/env python3

import sys
from PyQt5.QtWidgets import *

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

        self.button = QPushButton('読み込み・表示')
        self.button.clicked.connect(self.output)
        self.inputText = QLineEdit()
        self.inputText.setText("")

        self.outputText = QLineEdit()
        self.outputText.setText("")
        self.outputText.setReadOnly(True)

        textLayout = QHBoxLayout()
        textLayout.addWidget(self.inputText)
        textLayout.addWidget(self.outputText)

        layout = QVBoxLayout()
        layout.addLayout(textLayout)
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.setWindowTitle("Button")

    def output(self):
        self.outputText.setText(self.inputText.text())

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

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

テキストを入力してボタンを押すと、テキストが出力される

### QGraphicsViewで入力された文字列を表示

```python:string-graphic.py
#!/usr/bin/env python3

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


class ShowString(QGraphicsItem):
    def __init__(self, width=200, height=10, text=""):
        super(ShowString, self).__init__()
        self.width = width
        self.height = height
        self.text = text

    def paint(self, painter, option, widget):
        painter.setPen(Qt.black)
        painter.drawText(0, 20, self.text)

    def boundingRect(self):
        return QRectF(0,0,400,100)

    def setText(self, text):
        self.text = text
        self.update()

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

        self.graphicView = QGraphicsView()
        self.showString = ShowString()
        scene = QGraphicsScene(self.graphicView)
        scene.setSceneRect(0, 0, 400, 100)
        self.graphicView.setScene(scene)
        self.graphicView.resize(300,50)
        scene.addItem(self.showString)

        self.button = QPushButton('読み込み・表示')
        self.button.clicked.connect(self.output)
        self.inputText = QLineEdit()
        self.inputText.setText("")

        self.outputText = QLineEdit()
        self.outputText.setText("")
        self.outputText.setReadOnly(True)

        textLayout = QHBoxLayout()
        textLayout.addWidget(self.inputText)
        textLayout.addWidget(self.outputText)

        layout = QVBoxLayout()
        layout.addWidget(self.graphicView)
        layout.addLayout(textLayout)
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.setWindowTitle("Button")

    def output(self):
        self.outputText.setText(self.inputText.text())
        self.showString.setText(self.inputText.text())

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

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

```
一個前のプログラムに、QGraphicsViewでの文字列出力を追加した

### またサンプルプログラム追加するかも。。。
続き：[PyQt5とPythonでサブウィンドウを出してみる](http://qiita.com/hnkz/items/860007d01aa81d14f0d6)

## 感想・考察

以上、PyQt5とPython3で遊んでみた、でした。
本当に感覚的にGUI設計ができるので、好き。

### 参考
以下、参考にさせてもらいました。ありがとうございました。
http://d.hatena.ne.jp/mFumi/20141112/1415806010
http://qiita.com/kenasman/items/55505654823e9d040e6e