web-dev-qa-db-ja.com

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

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

基本的なプログラミング言語としてPythonを使用することはまだ意図されており、頭に浮かぶ最初の質問は次のとおりです。どのPythonバインディングを使用すべきか PyQt または PySide

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

ありがとう!

59
David Planella

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)はmuchよりも優れていますPyQt4のAPIバージョン1。APIバージョン1には、python文字列を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を使用していると仮定すると、PySidePyQt4の両方と互換性のあるコードをかなり簡単に作成できます。 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]
63
DrAl