やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Qtデザイナで画面をつくってPySide2で使う

 イベント処理も実装する。

成果物

2

やってみる

  1. Qtデザイナで画面をつくる
  2. 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>

 まずはデザイナを起動して新しい画面をつくる。

  1. Qtデザイナを起動する
  2. 新しいフォームダイアログが起動する
  3. templates/formatsからMainWindowを選ぶ
  4. 作成ボタンを押す
  5. 編集画面になる

0

 テキストボックスを追加する。

  1. 左のウィジェットボックスからText EditをMainWindowへDnDする
  2. Text EditDnDして位置やサイズを調整する

1

 レイアウトを設定する。(ウインドウサイズに応じてウィジェットサイズが可変する)

  1. 右のオブジェクトインスペクタからMainWindowを右クリックする
  2. 右クリックメニューからレイアウト垂直に並べるを選ぶ

 ファイルに保存する。

  1. メニュー⇢ファイル名前をつけて保存を選ぶ
  2. 任意のパスで保存する(ここでは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

2

所感

 画面はXMLファイルにしたほうがよいのだろうか? それともPythonコードで書いたほうがいいのか?

 XMLにしたほうがPythonコードを短くできる。QtデザイナでマウスのDnDにより書けるのでコードを書かずに済む。

 Pythonコードで書いたほうがコピペによる再現性が高いのでは? また、Pythonコード編集のほうが好きなように変更しやすいのでは?

 一番うれしいのは、デザイナで描いたらXML, QML, Pythonコードで出力してくれること。また、各種ファイルを読み込めばデザイナで画面を表示してくれること。できたらいいなぁ。でも難しいんだろうなぁ。

対象環境

$ uname -a
Linux raspberrypi 5.4.83-v7l+ #1379 SMP Mon Dec 14 13:11:54 GMT 2020 armv7l GNU/Linux