新しいQtプロジェクトにPyQtまたはPySideを使用する必要がありますか?


59

最近、QtおよびQtQuick Ubuntuアプリ用のQuicklyテンプレートの作成に関する会話に参加しました。アイデアは、UbuntuアプリケーションQuicklyテンプレートのベースとなっているGTKを使用するのと同じように、コンセプトからパッケージまでQtアプリを簡単に開発できるようにすることです。

基本的なプログラミング言語としてPythonを使用することは依然として目的であり、最初に頭に浮かぶ疑問は、どのPythonバインディングでPyQtPySideのどちらを使用すべきかということです。

両方の技術を経験した人々から、それぞれの長所と短所、それぞれの保守、Qt APIのバインディングへのマッピングなどを聞いてみたいと思います。

ありがとう!


python-qt4はメインにあり、python-pysideはユニバースにあります。おそらくこれもKubuntuの人たちに聞いてみるべきだと思う。
ジェレミービチャ

この質問は、stackoverflow.comまたはProgrammers.stackexchange.comに配置する方が適切です。
DRAL

@DrAlに感謝します。ええ、私もそれを疑問に思っていましたが、Ubuntu用のQuicklyテンプレートを作成するためのものでした。AskUbuntuに決めたのはそのためです。
デビッドプラネラ

回答:


63

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.QStringsに戻します。APIバージョン2(およびPySide)では、全体を通してPython文字列を使用します。PyQt4とPySideを簡単に切り替える方法については、両方を試してみたい場合は以下を参照してください。

私が書いたコードのほとんどは、PyQt4とPySideで同じように機能するようです。歴史的に、私は常にPython GUIにPyQt4を使用していましたが、現在書いているほとんどの新しいものはPySideを使用しています(主に、より柔軟なライセンスが原因です)。両方を試してみて、それらを見つける方法を確認することをお勧めします。QtVariant.py(下記)を使用する場合、それらを切り替えるのは簡単であり、決定を下すときに更新が必要なファイルは1つだけです。

ドキュメンテーション

PyQt4PySideの両方のドキュメントは、メインの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]

2
PySideは多くの場合、高レベルのPythonオブジェクトを受け入れるため、UIローダー関数はのようなものに単純化return QtUiTools.QUiLoader().load(uifile)でき、そのQFile定型文なしでファイルパスを取得します。
クリスビリントン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.