PyQt4とPySideはどちらも、Qt APIと非常によく似たマッピングを持っています。ただし、いくつかの違いがあります。私の意見は以下のとおりです。
メンテナンス
両方ともよく維持されています。PySideは現在、より多くの定期的なリリースを作成しています。PyQt4よりもQtに密接にリンクしており、新しいプロジェクトとして現在活発なコミュニティがあるためです。しかし、それは私の印象であり、間違っているかもしれません。
PyQt4には、商用サポートのオプションがあります(これがPySideに当てはまるかどうかはわかりません)。
ライセンス
PyQt4は商用ライセンスまたはGPLのいずれかでリリースされます。PySideはLGPLでリリースされています。商用アプリケーションの場合、これは大きな違いです。
APIとPythonバージョン
PyQt4は2つの異なるAPIをサポートしています。APIバージョン1はpython 2.xアプリケーションのデフォルトであり、APIバージョン2はpython 3.xアプリケーションのデフォルトです。
PySideは1つのAPIのみをサポートします。これは、PyQt4のAPIバージョン2とほぼ同等です。APIバージョン2(またはPySide API)は、PyQt4のAPIバージョン1よりも動作しやすくなります。文字列をQtCore.QString
sに戻します。APIバージョン2(およびPySide)では、全体を通してPython文字列を使用します。PyQt4とPySideを簡単に切り替える方法については、両方を試してみたい場合は以下を参照してください。
私が書いたコードのほとんどは、PyQt4とPySideで同じように機能するようです。歴史的に、私は常にPython GUIにPyQt4を使用していましたが、現在書いているほとんどの新しいものはPySideを使用しています(主に、より柔軟なライセンスが原因です)。両方を試してみて、それらを見つける方法を確認することをお勧めします。QtVariant.py(下記)を使用する場合、それらを切り替えるのは簡単であり、決定を下すときに更新が必要なファイルは1つだけです。
ドキュメンテーション
PyQt4とPySideの両方のドキュメントは、メインのQtドキュメントから自動生成されます。私の意見では、PySideのドキュメントは実際に使用するもののより良い表現ですが、実際には、とにかくQtのドキュメントを使用する傾向があります(C ++のドキュメントをPythonに精神的に翻訳するのは非常に簡単です)。
外部ライブラリ
外部ライブラリを使用している場合、一部はまだPySideで動作しません。正直に言うとPySideで作業する必要はあまりありませんが、2、3年前に私は(Qtリアクターで)ツイストとmatplotlibを使用してPySideではなくPyQt4を使用するコードを書きました。これらのライブラリは、今までに両方をサポートするように更新された可能性が高いと思いますが、私はチェックしていません。
PyQt4またはPySideでコードを機能させる
python 2.xを使用していると仮定すると、QtVariant.pyを作成して以下を使用することで、PySide と PyQt4の両方と互換性のあるコードをかなり簡単に作成できます。
from QtVariant import QtGui, QtCore
または何でも。私が使用するQtVariant.pyは次のようになります。
import sys
import os
default_variant = 'PySide'
env_api = os.environ.get('QT_API', 'pyqt')
if '--pyside' in sys.argv:
variant = 'PySide'
elif '--pyqt4' in sys.argv:
variant = 'PyQt4'
elif env_api == 'pyside':
variant = 'PySide'
elif env_api == 'pyqt':
variant = 'PyQt4'
else:
variant = default_variant
if variant == 'PySide':
from PySide import QtGui, QtCore
# This will be passed on to new versions of matplotlib
os.environ['QT_API'] = 'pyside'
def QtLoadUI(uifile):
from PySide import QtUiTools
loader = QtUiTools.QUiLoader()
uif = QtCore.QFile(uifile)
uif.open(QtCore.QFile.ReadOnly)
result = loader.load(uif)
uif.close()
return result
elif variant == 'PyQt4':
import sip
api2_classes = [
'QData', 'QDateTime', 'QString', 'QTextStream',
'QTime', 'QUrl', 'QVariant',
]
for cl in api2_classes:
sip.setapi(cl, 2)
from PyQt4 import QtGui, QtCore
QtCore.Signal = QtCore.pyqtSignal
QtCore.QString = str
os.environ['QT_API'] = 'pyqt'
def QtLoadUI(uifile):
from PyQt4 import uic
return uic.loadUi(uifile)
else:
raise ImportError("Python Variant not specified")
__all__ = [QtGui, QtCore, QtLoadUI, variant]