새로운 Qt 프로젝트에 PyQt 또는 PySide를 사용해야합니까?


59

최근 에 Qt 및 QtQuick Ubuntu 앱용 Quickly 템플릿을 만드는 방법에 대한 대화에 참여했습니다 . 아이디어는 Ubuntu 응용 프로그램 Quickly 템플릿이 기반으로하는 GTK와 마찬가지로 개념에서 패키지까지 Qt 앱을 쉽게 개발할 수 있도록하는 것입니다.

의도는 여전히 파이썬을 기본 프로그래밍 언어로 사용하는 것이며, 가장 먼저 떠오르는 질문은 PyQt 또는 PySide를 사용해야하는 파이썬 바인딩은 무엇입니까?

두 기술에 경험이 많은 사람들에게 각각의 장단점이 무엇인지, 각각이 얼마나 잘 유지되고 있는지, Qt API가 바인딩에 얼마나 잘 매핑되었는지 등을 듣고 싶습니다.

감사!


python-qt4는 메인에 있고 python-pyside는 우주에 있습니다. 쿠분투들에게도 물어봐야 할 것 같습니다.
Jeremy Bicha

이 질문은 stackoverflow.com 또는 programmers.stackexchange.com에 더 잘 배치 될 수 있습니다.
DrAl

@DrAl에게 감사합니다. 예, 궁금합니다. 특히 Ubuntu 용 Quickly 템플릿을 작성하기위한 것이기 때문에 AskUbuntu를 결정했습니다.
David Planella

답변:


63

PyQt4와 PySide는 모두 Qt API와 매우 유사한 매핑을 가지고 있습니다. 그러나 내 의견은 아래에 설명되어 있습니다.

정비

둘 다 잘 관리되어 있습니다. PySide는 현재 훨씬 더 정기적 인 릴리스를 제공합니다. PyQt4보다 Qt와 더 밀접하게 연결되어 있으며 새로운 프로젝트로 인해 현재 더 활발한 커뮤니티가 있다고 생각합니다. 그러나 그것은 단지 나의 인상이며 잘못된 것일 수 있습니다.

PyQt4에는 상용 지원 옵션이 있습니다 (PySide에 해당하는지 여부는 알 수 없습니다).

특허

PyQt4는 상용 라이센스 또는 GPL로 배포됩니다 . PySide는 LGPL 에 따라 배포 됩니다. 상업용 응용 프로그램의 경우 이는 큰 차이입니다.

API 및 Python 버전

PyQt4는 두 가지 다른 API를 지원합니다. API 버전 1은 python 2.x 애플리케이션의 기본값이고 API 버전 2는 python 3.x 애플리케이션의 기본값입니다.

PySide는 PyQt4의 API 버전 2와 거의 동일한 하나의 API 만 지원합니다. API 버전 2 (또는 PySide API)는 PyQt4의 API 버전 1보다 작동하는 것이 훨씬 좋습니다. 문자열을 QtCore.QStrings로 다시 되돌립니다. API 버전 2 (및 PySide)에서는 파이썬 문자열 만 사용합니다. PyQt4와 PySide를 간단하게 전환하려면 아래를 참조하십시오.

내가 작성한 대부분의 코드는 PyQt4와 PySide에서 동일하게 작동하는 것 같습니다. 역사적으로, 나는 항상 파이썬 GUI에 PyQt4를 사용했지만, 내가 쓰는 대부분의 새로운 내용은 PySide를 사용합니다 (주로 더 유연한 라이센싱으로 인해). 나는 당신이 두 가지를 모두 시도하고 그들을 찾는 방법을 보는 것이 좋습니다. QtVariant.py (아래)를 사용하는 경우 이들 사이를 전환하는 것은 쉽지 않으며 결정을 내릴 때 업데이트해야하는 파일이 하나만 있습니다.

문서

PyQt4PySide에 대한 설명서 는 기본 Qt 설명서 에서 자동 생성됩니다 . 내 의견으로는, PySide 문서는 실제로 사용하는 것을 더 잘 표현하지만 실제로 Qt 문서를 사용하는 경향이 있습니다 (C ++ 문서를 정신적으로 파이썬으로 변환하는 것은 매우 쉽습니다).

외부 라이브러리

외부 라이브러리를 사용하는 경우 일부는 아직 PySide에서 작동하지 않습니다. PySide로 정직하게 작업해야 할 것이 많지는 않지만 몇 년 전 (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 상용구없이 파일 경로를 사용하여과 같이 단순화 할 수 있습니다 .
Chris Billington
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.