概要
本記事は、12/15 投稿記事 PyQt入門編で調べ切れなかったことについての追加調査結果をまとめます。
具体的には、PyQt5, Qt for python(PySide2) 両者の違いを比較したいと思います。
簡易比較表
以下、Web 上の情報を元に、主な違いを表にまとめてみます。
Category | PyQt5 | Qt for Python |
---|---|---|
Vendor | Riverbank Computing 社 | The Qt Company |
License | GPLv3 Com.1 |
LGPLv2.1 GPLv3 Com.1 |
Python Version | 3.5+(3.7.3で確認済) | 3.5+ |
URL | https://www.riverbankcomputing.com/software/pyqt/intro | https://www.qt.io/qt-for-python |
開発開始時期 | 早い | 遅い |
シェア | 大 | 中? |
Version up | 早くて多い | ある程度まとめて? |
Document | 多い(英語) | 少ない(英語) |
言語制約 | 緩め | 厳密 |
QtQuick,QML | Full support | Full support |
解説
ライセンスについては、LGPL が選択できる Qt for Python に分がありますが、PyQt5 は先行して開発した分、アプリケーションやライブラリ、ドキュメントなどが充実しているようです。
API について、 PyQt は Qt のオリジナルにはない独自のクラスを残している事があるようです。言語レベルでの制約は比較的緩めのようです(色々な書き方をしても、比較的安定して動作するようです)。
Qt for Python は過去の縛りが少ないためなのか、Qt の Core クラスをそのまま使えるように配慮するなど、スッキリしたAPIを目指しているようです。
例えば、以下の signal, slot の定義です。
valueChanged = pyqtSignal([dict], [list])
@pyqtSlot(int, str)
def foo(self, arg1, arg2):
""" C++: void foo(int, QString) """
speakNumber = QtCore.Signal(int)
@QtCore.Slot(str)
def saySomeWords(words):
print words
近年の傾向
数年前までは、Qt for Python(PySide) は PyQt の一部の API をサポートするレベルであり、Python のサポートバージョンも古く、動作が不安定、というような問題もあったようです。
しかし、Qt 開発元の The Qt Company が力を入れてサポートしているため、徐々に差がなくなって来ているようです。
まとめ
まとめると、どちらかが突出してよい、というわけではなさそうです。
個人的見解となりますが、PyQt は、商用利用する必要がない社内評価用アプリケーションなどを作成するのに適しているのではないか、と思っています。なぜなら、過去の豊富な PyQt アプリ・ライブラリ・ドキュメントが利用可能なため、開発スピードも早く済むのではないか、と思います。
一方、Qt for Python は商用利用に適しているかと思われます。PyQt から Qt for Python への移植も比較的楽にできるようなので、PyQt でプロトタイプ作成し、Qt for Python に移植する、という流れが良いかもしれません。