概要
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の公式ドキュメントを参照すること。