최근 에 Qt 및 QtQuick Ubuntu 앱용 Quickly 템플릿을 만드는 방법에 대한 대화에 참여했습니다 . 아이디어는 Ubuntu 응용 프로그램 Quickly 템플릿이 기반으로하는 GTK와 마찬가지로 개념에서 패키지까지 Qt 앱을 쉽게 개발할 수 있도록하는 것입니다.
의도는 여전히 파이썬을 기본 프로그래밍 언어로 사용하는 것이며, 가장 먼저 떠오르는 질문은 PyQt 또는 PySide를 사용해야하는 파이썬 바인딩은 무엇입니까?
두 기술에 경험이 많은 사람들에게 각각의 장단점이 무엇인지, 각각이 얼마나 잘 유지되고 있는지, Qt API가 바인딩에 얼마나 잘 매핑되었는지 등을 듣고 싶습니다.
감사!
답변
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.QString
s로 다시 되돌립니다. API 버전 2 (및 PySide)에서는 파이썬 문자열 만 사용합니다. PyQt4와 PySide를 간단하게 전환하려면 아래를 참조하십시오.
내가 작성한 대부분의 코드는 PyQt4와 PySide에서 동일하게 작동하는 것 같습니다. 역사적으로, 나는 항상 파이썬 GUI에 PyQt4를 사용했지만, 내가 쓰는 대부분의 새로운 내용은 PySide를 사용합니다 (주로 더 유연한 라이센싱으로 인해). 나는 당신이 두 가지를 모두 시도하고 그들을 찾는 방법을 보는 것이 좋습니다. QtVariant.py (아래)를 사용하는 경우 이들 사이를 전환하는 것은 쉽지 않으며 결정을 내릴 때 업데이트해야하는 파일이 하나만 있습니다.
문서
PyQt4 및 PySide에 대한 설명서 는 기본 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]