概要

PySide6は、Qt for PythonプロジェクトのPython公式モジュールであり、Qt 6以降のフレームワーク全体にアクセスすることができる。
Qt for Pythonプロジェクトはオープンに開発されており、全てのコードがgitリポジトリにあり、オープンな設計プロセスがある等、最新のOSSプロジェクトで期待される全てのモジュールが整っている。

Qt 5との互換性については、PySide2のページを参照すること。


PySide6のインストール

※注意
PySide6を使用するには、Python 3.8以降が必要となる。

Clangのインストール

PySide6では、ClangベースのC++パーサを使用しているため、ビルドにはClang 13.0以降が必要である。
プリビルドバージョンは、Qtの公式Webサイトからダウンロードできる。
なお、Windows、MacOS、Linux (RHEL、Ubuntu、Debian) が対応している。

# Winodws + Visual Studiio 2022
libclang-release_<バージョン>-based-windows-vs2022_arm64.7z

# Linux
# Debian GNU/Linux向けはAarch64のみであることに注意
libclang-release_<バージョン>-based-linux-Rhel<バージョン>-gcc<バージョン>-x86_64.7z
libclang-release_<バージョン>-based-linux-Ubuntu<バージョン>-gcc<バージョン>-x86_64.7z
libclang-release_<バージョン>-based-linux-Debian-<バージョン>-gcc<バージョン>-arm64.7z


ダウンロードしたファイルを解凍する。

7z x libclang-release_*


Windowsの場合では、PowerShellまたはコマンドプロンプトで環境変数LLVM_INSTALL_DIRをClangのディレクトリに指定する。

 setx LLVM_INSTALL_DIR "C:\<Clangのインストールディレクトリ>\libclang"
 setx PATH "C:\<Clangのインストールディレクトリ>\libclang\bin;%PATH%"


Linuxの場合では、~/.profileファイル等に、環境変数LLVM_INSTALL_DIRをClangのディレクトリに指定する。

vi ~/.profile


 # ~/.profileファイル
 
 export LLVM_INSTALL_DIR="/<Clangのインストールディレクトリ>/libclang"


PySide6のインストール

venv、あるいは、virtualenvで仮想環境を使用することを推奨する。
直接、pipコマンド経由でPySide6をインストールしないほうがよい。

Pythonの仮想環境を作成する。

python -m venv env
# または
python3 -m venv env


Pythonの仮想環境をアクティベートする。

# Windows
env\Scripts\activate.bat

# Linux, MacOS
source env/bin/activate


QtのサーバやPyPiからpipコマンド経由でインストールできるようになっている。

pip install PySide6



PySide6のライセンス

PySide6はLGPL v3でライセンスされている。
そのため、商用利用が可能であり、PySide6を使用したアプリケーションをオープンソースにする必要はない。

ただし、PySide6のソースコード自体に変更を加えた場合は、その変更部分を公開する必要がある。
また、アプリケーションを配布する場合は、LGPLライセンスのコピーを含める必要がある。

なお、Qt (PySide6の基盤となっているフレームワーク) 自体には商用ライセンスも存在するが、PySide6はLGPLで提供されているため、LGPLの条件を満たせば商用利用も可能である。

組み込み機器で使用する場合

LGPLライセンスの基本要件として、以下に示すような配置が必要となる。

ソフトウェア本体と共に、LGPLライセンスのテキストを提供する必要がある。

  • 製品付属のドキュメント(取扱説明書など)にライセンステキストを掲載する。
  • 製品内の読み取り可能なファイルシステム上にライセンスファイルを配置する。
  • 製品のUIからアクセス可能なメニューやページでライセンス情報を表示する。


さらに、以下に示すような情報へのアクセス方法も提供する必要がある。

  • PySide6のソースコードの入手方法
  • 使用しているPySide6のバージョン情報
  • PySide6モジュール本体に改変を加えた場合は、その改変内容


 # 実装の具体例
 # ライセンス情報を表示するための関数例
 def show_license_info():
    license_text = """
    PySide6 is licensed under the GNU Lesser General Public License v3.
    Complete license text can be found at:
    /usr/share/licenses/PySide6/LICENSE
 
    Source code is available at:
    https://download.qt.io/official_releases/QtForPython/
 
    Version: PySide6 6.x.x
    """
 
    # UIでの表示やファイル出力等の処理
    # ...略


組み込み機器の特性上、全てのソースコードを機器内に保存することが現実的でない場合は、Webサイトでの提供や要求に応じて提供する方法も認められている。


Qt Widgetsアプリケーションの作成

 import sys
 import random
 
 # PySide6モジュールは、サブモジュールとしてQt APIへのアクセスを提供する
 # QtCore、QtWidgets、QtGuiのサブモジュールをインポートする
 from PySide6 import QtCore, QtWidgets, QtGui
 
 # QWidgetクラスを継承する
 # 基本的なUI (QPushButton, QLabel) を含む
 class MyWidget(QtWidgets.QWidget):
    def __init__(self):
       super().__init__()
 
       self.hello = ["Hallo Welt", "Hei maailma", "Hola Mundo", "Привет мир"]
 
       self.button = QtWidgets.QPushButton("Click me!")
       self.text = QtWidgets.QLabel("Hello World", alignment=QtCore.Qt.AlignCenter)
 
       self.layout = QtWidgets.QVBoxLayout(self)
       self.layout.addWidget(self.text)
       self.layout.addWidget(self.button)
 
       self.button.clicked.connect(self.magic)
 
    // QPushButtonを押下する時magicメソッドが呼び出される
    @QtCore.Slot()
    def magic(self):
       self.text.setText(random.choice(self.hello))
 
 if __name__ == "__main__":
    app = QtWidgets.QApplication([])
 
    widget = MyWidget()
    widget.resize(800, 600)
    widget.show()
 
    sys.exit(app.exec())



Qt QMLアプリケーションの作成

QQmlApplicationEngineクラスをインスタンス化して、QMLファイルを読み込む。

 import sys
 from PySide6.QtGui import QGuiApplication
 from PySide6.QtQml import QQmlApplicationEngine
 
 if __name__ == "__main__":
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()
    engine.addImportPath(sys.path[0])
    engine.loadFromModule("Example", "Main")
 
    if not engine.rootObjects():
       sys.exit(-1)
 
    exit_code = app.exec()
    del engine
    sys.exit(exit_code)


 import QtQuick
 import QtQuick.Controls
 import QtQuick.Layouts
 
 Window {
    width: 300
    height: 200
    visible: true
    title: "Hello World"
 
    readonly property list<string> texts: ["Hallo Welt", "Hei maailma", "Hola Mundo", "Привет мир"]
 
    function setText() {
       var i     = Math.round(Math.random() * 3)
       text.text = texts[i]
    }
 
    ColumnLayout {
       anchors.fill: parent
 
       Text {
          id: text
          text: "Hello World"
          Layout.alignment: Qt.AlignHCenter
       }
 
       Button {
          text: "Click me"
          Layout.alignment: Qt.AlignHCenter
          onClicked:  setText()
       }
    }
 }


Qt WidgetsならびにQt QMLのサンプルコードの詳細を知りたい場合は、Qtの公式ドキュメントを参照すること。