Python3のGUI:PyQt6とPySide6 1/2

まえがき

以前に書いた記事でQtを使ったアプリケーションを紹介した。最近そのQtがバージョンアップしたので、これを調べてみたい。

Qtとは?

最初に少しおさらい。

  • 公式サイト:Qt
  • 読み方「キュート」
  • 美しいGUIを作れるぜ。
  • デザインツールもご用意しております。
  • プラットフォームを選ばないぜ。

公式概要図。

Qtの概要
Qtの概要
  • サポート言語: C++, Python, Qt QML
    • コミュニティでサポート: Rust, Ruby C#, Go, Perl
  • デザインツール: Qt Design Studio
  • Pycharmが開発環境としてGoodらしい。Qiitaより。

変更履歴

2021/05/04: 新規追加

PyQt6とPySide6は何が違う?

両方ともPython用のライブラリだが:

  • 基本的に目的は同じ。
  • 作り元が違うだけ。PySideを作ったのがQtの人たち。
  • 現在両方ともQt6に問題なく対応している。
  • ただし、QtプロジェクトはPython用のリリースとしてPySideを正式に採用した。

一応、ライセンスが違う。

ライセンスが:

  • PyQt6 => GPL or Commercial
  • PySide6 => LGPL

となっている。

PyQt6とPySide6は99%同じ。

なぜならどちらもQt6をラップしているから。99%同じAPIを使う。

つまりどちらから使い始めても、もう片方をほぼ障壁なく使える。

Qt6に導入された主な変更点

  1. 列挙型とフラグに完全修飾名を使用するようになった。
  2. Qt Creator/Designerから読み込まれたファイルの処理方法。

1. 完全修飾名を使用する

PyQt6の場合:

  • Qt.DecorationRoleやQt.AlignLeftなどはQt.ItemDataRole.DisplayRole、Qt.Alignment.AlignLeftとなり、長い名前で使用する必要がある。

PySide6の場合:

  • 短い名前も長い名前も引き続きサポートされる。

ということはとにかく長い名前にしておけばいいのかというとそうでなく、PyQt6とPySide6がフラグに微妙に異なる命名規則を使用しているので、単に長い形式または短い形式を選択して、PyQt6とPySide6の間の互換性を維持することはできない。

2. ファイル処理方法

Qt Creator/Designerから読み込まれたファイルの処理方法について。

ロードの方法

PyQT6の場合:

  • UIファイルを直接ロードしてオブジェクトを生成するために使用できるサブモジュールを提供する。
from PyQt6 import QtWidgets, uic

app = QtWidgets.QApplication(sys.argv)
window = uic.loadUi("mainwindow.ui")

PySide6の場合:QUILoader最初にオブジェクトを作成する必要があるためその分長くなる。

from PySide6 import QtCore, QtGui, QtWidgets
from PySide6.QtUiTools import QUiLoader

loader = QUiLoader()

app = QtWidgets.QApplication(sys.argv)
window = loader.load("mainwindow.ui", None)

既存のオブジェクトにUIをロードする方法

PyQT6の場合:ロードする(uic.loadUi(“mainwindow.ui”, self))には、2番目のパラメーターとして(既存のウィジェット)の受け渡しをQMainWindow.init呼び出すことができる。

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        uic.loadUi("mainwindow.ui", self)

PiSide6の場合:PyQt6のようにはいかないのでこうする。.load()は作成しているウィジェットの親ウィジェットだ。このやり方ではinit使えないので、代わりに関数を定義することで同等のことができる。

def mainwindow_setup(w):
    w.setWindowTitle("MainWindow Title")

app = QtWidgets.QApplication(sys.argv)

window = loader.load("mainwindow.ui", None)
mainwindow_setup(window)

UIファイルをPythonに変換

PyQt6もPySide6も変換のための同一のスクリプトを提供している。

PyQt6の場合:

pyuic6 mainwindow.ui -o MainWindow.py

PySide6の場合:

pyside6-uic mainwindow.ui -o MainWindow.py

使い方。

PyQt6の場合:

import sys
from PyQt6 import QtWidgets
from MainWindow import Ui_MainWindow

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setupUi(self)


app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()

PySide6の場合:

import sys
from PySide6 import QtWidgets
from MainWindow import Ui_MainWindow

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setupUi(self)


app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

参考文献

MARTIN FiTZPATRiCK.: PyQt6 vs PySide6: What’s the difference between the two Python Qt libraries?

コメントする