1. donkonishi

    Posted

    donkonishi
Changes in title
+PyQt5とPython3で遊んでみた
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,214 @@
+
+## 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_())
+
+```
+
+### またサンプルプログラム追加するかも。。。
+
+## 感想・考察
+
+以上、PyQt5とPython3で遊んでみた、でした。
+本当に感覚的にGUI設計ができるので、好き。
+
+
+