イベント処理も実装する。
成果物
やってみる
- Qtデザイナで画面をつくる
- PySide2で使う
1. Qtデザイナで画面をつくる
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>413</width> <height>105</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralwidget"> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QLineEdit" name="lineEdit"/> </item> </layout> </widget> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>413</width> <height>28</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui>
まずはデザイナを起動して新しい画面をつくる。
- Qtデザイナを起動する
新しいフォーム
ダイアログが起動するtemplates/formats
からMainWindow
を選ぶ作成
ボタンを押す- 編集画面になる
テキストボックスを追加する。
レイアウトを設定する。(ウインドウサイズに応じてウィジェットサイズが可変する)
- 右の
オブジェクトインスペクタ
からMainWindow
を右クリックする - 右クリックメニューから
レイアウト
⇢垂直に並べる
を選ぶ
ファイルに保存する。
- メニュー⇢
ファイル
⇢名前をつけて保存
を選ぶ - 任意のパスで保存する(ここでは
talker.ui
とする)
2. PySide2で使う
mywin.py
#!python3 # -*- coding: utf-8 -*- import sys import os.path from PySide2 import QtCore, QtGui, QtWidgets from PySide2.QtUiTools import QUiLoader class MyWindow(QtWidgets.QMainWindow): def __init__(self, parent=None): super().__init__(parent) CURRENT_PATH = os.path.dirname(os.path.abspath(sys.argv[0])) UI_PATH = os.path.join(CURRENT_PATH, 'talker.ui') self.ui = QUiLoader().load(UI_PATH) self.setCentralWidget(self.ui) self.ui.lineEdit.returnPressed.connect(self.returnPressed) def returnPressed(self): print(self.ui.lineEdit.text()) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) win = MyWindow() win.show() sys.exit(app.exec_())
python3 mywin.py
所感
画面はXMLファイルにしたほうがよいのだろうか? それともPythonコードで書いたほうがいいのか?
XMLにしたほうがPythonコードを短くできる。QtデザイナでマウスのDnDにより書けるのでコードを書かずに済む。
Pythonコードで書いたほうがコピペによる再現性が高いのでは? また、Pythonコード編集のほうが好きなように変更しやすいのでは?
一番うれしいのは、デザイナで描いたらXML, QML, Pythonコードで出力してくれること。また、各種ファイルを読み込めばデザイナで画面を表示してくれること。できたらいいなぁ。でも難しいんだろうなぁ。
対象環境
- Raspbierry pi 4 Model B
- Raspberry Pi OS buster 10.0 2020-08-20 ※
- bash 5.0.3(1)-release
- Python 3.7.3
- PySide2
$ uname -a Linux raspberrypi 5.4.83-v7l+ #1379 SMP Mon Dec 14 13:11:54 GMT 2020 armv7l GNU/Linux