最近、QtおよびQtQuick Ubuntuアプリ用の Quickly テンプレートの作成に関する会話に参加しました。アイデアは、UbuntuアプリケーションQuicklyテンプレートのベースであるGTKを使用するのと同じように、コンセプトからパッケージまでQtアプリを簡単に開発できるようにすることです。
基本的なプログラミング言語としてPythonを使用することはまだ意図されており、頭に浮かぶ最初の質問は次のとおりです。どのPythonバインディングを使用すべきか PyQt または PySide ?
両方の技術を経験した人々から、それぞれの長所と短所、それぞれの保守、Qt APIのバインディングへのマッピングなどを聞いてみたいと思います。
ありがとう!
PyQt4とPySideはどちらも、Qt APIと非常によく似たマッピングを持っています。ただし、いくつかの違いがあります。私の意見は以下のとおりです。
両方ともよく維持されています。 PySideは現在、より多くの定期的なリリースを作成しています。PyQt4よりもQtと密接にリンクしており、新しいプロジェクトとしては現在、より活発なコミュニティがあると思います。しかし、それは私の印象であり、間違っているかもしれません。
PyQt4には、商用サポートのオプションがあります(これがPySideに当てはまるかどうかはわかりません)。
PyQt4は商用ライセンスまたはGPLのいずれかでリリースされます。 PySideはLGPLの下でリリースされます。商用アプリケーションの場合、これは大きな違いです。
PyQt4は2つの異なるAPIをサポートしています。 APIバージョン1はpython 2.xアプリケーションのデフォルトであり、APIバージョン2はpython 3.xアプリケーションのデフォルトです。
PySideは1つのAPIのみをサポートします。これはPyQt4のAPIバージョン2とほぼ同等です。APIバージョン2(またはPySide API)はmuchよりも優れていますPyQt4のAPIバージョン1。APIバージョン1には、python文字列を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を使用するコードを書きました。これらのライブラリが今までに両方をサポートするように更新された可能性は高いと思いますが、私はチェックしていません。
python 2.xを使用していると仮定すると、PySideとPyQt4の両方と互換性のあるコードをかなり簡単に作成できます。 QtVariant.pyおよび使用:
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]