Qt for Python (PySide2) の基本的な使い方
[最終更新] (2019/06/03 00:31:32)
最近の投稿
注目の記事

概要

QT を Python から利用するためのライブラリには PyQt や PySide 等が存在します。PySide は元々 QT4 向けのライブラリでしたが、QT5 に対応するために新たに PySide2 が開発されました。PySide2 は Qt for Python ともよばれています。

Q: PySide? Qt for Python? what is the name?
A: The name of the project is Qt for Python and the name of the module is PySide2.
Q: Why PySide2 and not just PySide?
A: Since PySide was developed for Qt4, when the port was made to support Qt5, the name was changed to PySide2 to infer that is was a newer version.
https://wiki.qt.io/Qt_for_Python

PySide2 について基本的な使い方を記載します。今回は VirtualBox と Vagrant で Debian9/stretch をインストールして利用することにします。

以下のコマンドで同期しつつ、X11 で動作確認します。

vagrant rsync
vagrant rsync-auto

インストール

必要なバージョンの python や qt5 等をインストールする必要があります。

python

pyenv を利用すると簡単です。今回は 2.7.15 を利用することにします。

pyenv global 2.7.15

PySide2 自体は pip でインストールできます

pip install --index-url=http://download.qt.io/snapshots/ci/pyside/5.9/latest/ pyside2 --trusted-host download.qt.io

qt5 および依存ライブラリ

OpenGL 等が依存先としてまとめてインストールされます。環境によっては pyside2/wiki/Dependencies を参照して、不足しているパッケージを適宜追加でインストールします。

sudo apt-get install qt5-default
sudo apt-get install qttools5-dev-tools

動作検証

DISPLAY が利用できない場合は仮想ディスプレイを作成して利用します。

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

from sys import exit, argv
from PySide2.QtWidgets import QApplication, QLabel

def Main():
    app = QApplication(argv)
    label = QLabel("Hello World")
    label.show()
    exit(app.exec_())

if __name__ == '__main__':
    Main()

Uploaded Image

古い環境の場合は必要な共有ライブラリが存在せずにエラーになります。新しい OS を利用するか、必要に応じてソースコードからビルドします。例えば以下のような libc のバージョンエラーが発生します。

$ python sample.py
Traceback (most recent call last):
  File "sample.py", line 2, in <module>
    from PySide2.QtWidgets import QApplication, QLabel
ImportError: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home/username/.pyenv/versions/2.7.15/lib/python2.7/site-packages/PySide2/QtWidgets.so)

以下のようにソースコードからビルドして対応できます。

mkdir glibc_install
cd glibc_install/
wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.1.tar.gz
tar zxvf glibc-2.14.1.tar.gz
cd glibc-2.14.1/
mkdir build
cd build/
../configure --prefix=/opt/glibc-2.14
make -j4
sudo make install
export LD_LIBRARY_PATH=/opt/glibc-2.14/lib

その他の検証用のコード

HTML の利用

#!/usr/bin/python
# -*- coding: utf-8 -*-

from sys import exit, argv
from PySide2.QtWidgets import QApplication, QLabel

def Main():
    app = QApplication(argv)
    label = QLabel("<font color=red size=40>Hello World!</font>")
    label.show()
    exit(app.exec_())

if __name__ == '__main__':
    Main()

Uploaded Image

QML の利用

#!/usr/bin/python
# -*- coding: utf-8 -*-

from sys import exit, argv
from PySide2.QtWidgets import QApplication
from PySide2.QtQuick import QQuickView
from PySide2.QtCore import QUrl

def Main():
    app = QApplication(argv)
    view = QQuickView()
    url = QUrl("view.qml")
    view.setSource(url)
    view.show()
    exit(app.exec_())

if __name__ == '__main__':
    Main()

view.qml

import QtQuick 2.0

Rectangle {
  width: 200
  height: 200
  color: "green"
  Text {
    text: "Hello World"
    anchors.centerIn: parent
  }
}

Uploaded Image

メッセージボックスの利用

#!/usr/bin/python
# -*- coding: utf-8 -*-

from sys import exit, argv
from PySide2.QtWidgets import QApplication, QMessageBox

def Main():
    app = QApplication(argv)
    msg_box = QMessageBox()
    msg_box.setText("Hello World!")
    msg_box.show()
    exit(app.exec_())

if __name__ == '__main__':
    Main()

Uploaded Image

関数を実行する push ボタンの利用

#!/usr/bin/python
# -*- coding: utf-8 -*-

from sys import exit, argv
from PySide2.QtWidgets import QApplication, QPushButton

def f():
    print("clicked!")

def Main():
    app = QApplication(argv)

    # push 時に関数を実行
    button = QPushButton("Click me")
    button.clicked.connect(f)

    buttonExit = QPushButton("Exit")
    buttonExit.clicked.connect(app.exit)

    button.show()
    buttonExit.show()
    exit(app.exec_())

if __name__ == '__main__':
    Main()

Uploaded Image

QWidget を継承したクラスを作成

#!/usr/bin/python
# -*- coding: utf-8 -*-

from sys import exit, argv
from random import choice
from PySide2.QtCore import Qt
from PySide2.QtWidgets import QWidget, QLabel, QPushButton, QVBoxLayout, QApplication

class MyWidget(QWidget):
    def __init__(self):
        super(MyWidget, self).__init__()

        self.nums = ["1", "2", "3"]

        # ラベルの作成
        self.text = QLabel("0")
        self.text.setAlignment(Qt.AlignCenter)

        # push ボタンの作成
        self.button = QPushButton("Click me!")
        self.button.clicked.connect(self.f)

        # ラベルとボタンを格納する箱となるレイアウトの作成
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.text)
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)

    def f(self):
        self.text.setText(choice(self.nums))

def Main():
    app = QApplication(argv)
    widget = MyWidget()
    widget.show()
    exit(app.exec_())

if __name__ == '__main__':
    Main()

Uploaded Image

QDialog を継承したクラスを作成

QDialogQWidget を継承しています。

#!/usr/bin/python
# -*- coding: utf-8 -*-

from sys import exit, argv
from PySide2.QtWidgets import QLineEdit, QPushButton, QApplication, QVBoxLayout, QDialog

class MyForm(QDialog):
    def __init__(self):
        super(MyForm, self).__init__()
        self.setWindowTitle("My Form")

        # 入力フォーム、ボタン
        self.edit = QLineEdit("xxxx")
        self.button = QPushButton("yyyy")
        self.button.clicked.connect(self.f)

        # レイアウト
        layout = QVBoxLayout()
        layout.addWidget(self.edit)
        layout.addWidget(self.button)
        self.setLayout(layout)

    def f(self):
        print ("Hello %s" % self.edit.text())

def Main():
    app = QApplication(argv)
    form = MyForm()
    form.show()
    exit(app.exec_())

if __name__ == '__main__':
    Main()

Uploaded Image

シグナルとスロット

この続きが気になる方は

Qt for Python (PySide2) の基本的な使い方

残り文字数は全体の約 27 %
tybot
100 円
関連ページ
    概要 ロボットシステム開発のためのフレームワーク Robot Operating System (ROS) の環境構築および簡単な使い方について記載します。ここでは Debian9 を利用することにします。ROS は現行バージョン1 の Melodic Morenia ディストリビューションを扱います。 ROS 対応のロボット
    概要 ロボットアプリケーションの開発環境の一つ OpenRAVE (Open Robotics Automation Virtual Environment) の環境を構築するための手順を記載します。ここでは特に Debian9 を利用します。 インストール 依存パッケージ ビルドツール関連 sudo apt install git build-essential cmake
    概要 Qt 等で開発された X11 アプリケーションを利用するためには X サーバのクライアントが必要になります。X サーバは仮想的に Xvfb コマンドで作成することができます。X サーバのクライアントには fluxbox などの X11 ウィンドウマネージャ、ssh -X や x11vnc、その他 Qt 等で開発された X11 アプリケーションがあります。
    概要 Qt Quick は、こちらのページで記載した Qt フレームワークにおいて UI 作成のために利用されるライブラリです。Qt Quick で利用される言語 QML (Qt Modeling Language) について、基本的な使い方を記載します。 検証用のコード sample.py #!/usr/bin/python # -*- coding: utf-8 -*- from sy
    概要 リモートホストの X Window System (X11) を転送して利用する方法を、SSH および Virtual Network Computing (VNC) の二つの方法について記載します。 SSH サーバとホストの両方で X11 転送を有効にすることで利用できます。アプリケーション毎に転送できます。