「Qtその他 - PySide6」の版間の差分
71行目: | 71行目: | ||
<br> | <br> | ||
なお、Qt (PySide6の基盤となっているフレームワーク) 自体には商用ライセンスも存在するが、PySide6はLGPLで提供されているため、LGPLの条件を満たせば商用利用も可能である。<br> | なお、Qt (PySide6の基盤となっているフレームワーク) 自体には商用ライセンスも存在するが、PySide6はLGPLで提供されているため、LGPLの条件を満たせば商用利用も可能である。<br> | ||
<br><br> | |||
== Qt Widgetsアプリケーションの作成 == | |||
<syntaxhighlight lang="python"> | |||
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()) | |||
</syntaxhighlight> | |||
<br><br> | |||
== Qt QMLアプリケーションの作成 == | |||
QQmlApplicationEngineクラスをインスタンス化して、QMLファイルを読み込む。<br> | |||
<br> | |||
<syntaxhighlight lang="python"> | |||
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) | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="qml"> | |||
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() | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
Qt WidgetsならびにQt QMLのサンプルコードの詳細を知りたい場合は、[https://doc.qt.io/qtforpython-6/examples/index.html Qtの公式ドキュメント]を参照すること。<br> | |||
<br><br> | <br><br> | ||
2025年1月9日 (木) 07:00時点における版
概要
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の条件を満たせば商用利用も可能である。
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の公式ドキュメントを参照すること。