ฉันควรใช้ PyQt หรือ PySide สำหรับโครงการ Qt ใหม่หรือไม่?


59

เมื่อเร็ว ๆ นี้ฉันได้มีส่วนร่วมในการสนทนาเกี่ยวกับการสร้างเทมเพลตอย่างรวดเร็วสำหรับแอพ Qt และ QtQuick Ubuntu แนวคิดคือทำให้ง่ายต่อการพัฒนาแอพ Qt จากคอนเซ็ปต์จนถึงแพ็กเกจเนื่องจากตอนนี้ใช้ GTK ซึ่งเป็นแอปพลิเคชัน Ubuntu ที่ใช้เทมเพลตอย่างรวดเร็ว

ความตั้งใจที่จะยังคงที่จะใช้ Python เป็นภาษาโปรแกรมฐานและคำถามแรกที่มาถึงใจคือที่ผูกหลามเราควรใช้PyQtหรือPySide ?

ฉันต้องการจะได้ยินจากคนที่มีประสบการณ์ทั้งในด้านเทคโนโลยีสิ่งที่ข้อดีและข้อเสียของแต่ละคนเป็นอย่างไรการบำรุงรักษาแต่ละอย่างดีแค่ไหนการแมป Qt API กับการเชื่อมโยงนั้นดีเพียงใดเป็นต้น

ขอบคุณ!


python-qt4 อยู่ใน main และ python-pyside อยู่ในเอกภพ ฉันคิดว่าคุณน่าจะถามคนนี้กับ Kubuntu ด้วย
Jeremy Bicha

คำถามนี้อาจวางไว้ที่ดีกว่าใน stackoverflow.com หรือ programmers.stackexchange.com
DrAl

ขอบคุณ @DrAl ใช่ฉันก็สงสัยเช่นกัน แต่มันก็เป็นพิเศษสำหรับการสร้างเทมเพลตอย่างรวดเร็วสำหรับ Ubuntu ซึ่งเป็นเหตุผลที่ฉันตัดสินใจถาม AskUbuntu
David Planella

ฉันยังชี้ไปที่pyside.org/2012/03/pyside-becomes-a-qt-add-on
David Planella

คำตอบ:


63

ทั้ง PyQt4 และ PySide มีการแมปคล้ายกันมากกับ Qt API อย่างไรก็ตามมีความแตกต่างบางอย่างความคิดเห็นของฉันซึ่งอธิบายไว้ด้านล่าง:

ซ่อมบำรุง

พวกเขาทั้งสองได้รับการดูแลอย่างดี PySide สร้างการเผยแพร่เป็นประจำมากขึ้นในขณะนี้: ฉันคิดว่ามันเชื่อมโยงอย่างใกล้ชิดกับ Qt มากกว่า PyQt4 และเนื่องจากโครงการใหม่ที่มีชุมชนที่ใช้งานมากขึ้นในขณะนี้ อย่างไรก็ตามนั่นเป็นเพียงความประทับใจของฉันและอาจผิด

PyQt4 มีตัวเลือกของการสนับสนุนเชิงพาณิชย์ที่มีอยู่ (ฉันไม่รู้ว่านี่เป็นเรื่องจริงสำหรับ PySide หรือไม่)

การอนุญาต

PyQt4 ออกภายใต้ทั้งใบอนุญาตการค้าหรือจีพี ; PySide ออกภายใต้แอลจี สำหรับการใช้งานเชิงพาณิชย์นี่เป็นข้อแตกต่างที่สำคัญ

APIs และ Python เวอร์ชั่น

PyQt4 รองรับ API ที่ต่างกันสองตัว API version 1 เป็นค่าเริ่มต้นสำหรับแอปพลิเคชัน python 2.x และ API เวอร์ชัน 2 เป็นค่าเริ่มต้นสำหรับแอปพลิเคชัน python 3.x

PySide สนับสนุนเฉพาะหนึ่ง API ซึ่งเทียบเท่าประมาณจะ PyQt4 รุ่น API 2. API รุ่นที่ 2 (หรือ PySide API) จะมากดีกว่าที่จะทำงานกับกว่ารุ่น API PyQt4 1. ใน API รุ่นที่ 1 คุณมีจำนวนมากของรหัสที่ปลดเปลื้องหลาม สตริงเป็นQtCore.QStrings และกลับมาอีกครั้ง ใน API เวอร์ชัน 2 (และ PySide) คุณเพียงแค่ใช้สตริงหลามตลอด ดูวิธีง่ายๆในการสลับระหว่าง PyQt4 และ PySide ด้านล่างหากคุณต้องการเล่นกับทั้งคู่

รหัสส่วนใหญ่ที่ฉันเขียนดูเหมือนว่าทำงานได้ดีเท่าเทียมกันใน PyQt4 และ PySide ในอดีตฉันมักจะใช้ PyQt4 สำหรับ python GUIs แต่สิ่งใหม่ ๆ ที่ฉันเขียนตอนนี้ใช้ PySide (ส่วนใหญ่เป็นผลมาจากการออกใบอนุญาตที่ยืดหยุ่นมากขึ้น) ฉันขอแนะนำให้คุณลองทั้งสองอย่างและดูว่าคุณจะเจอพวกเขาอย่างไร หากคุณใช้ QtVariant.py (ด้านล่าง) การสลับระหว่างไฟล์เหล่านั้นไม่สำคัญและเมื่อคุณตัดสินใจจะมีเพียงไฟล์เดียวเท่านั้นที่ต้องมีการอัปเดต

เอกสาร

เอกสารสำหรับทั้งPyQt4และPySideจะถูกสร้างขึ้นโดยอัตโนมัติจากหลักเอกสาร Qt ในความคิดของฉันเอกสาร PySide เป็นตัวแทนที่ดีกว่าสิ่งที่คุณใช้จริง ๆ แต่ในทางปฏิบัติฉันมักจะใช้เอกสาร Qt อยู่ดี (มันค่อนข้างง่ายที่จะแปลเอกสาร C ++ เป็น Python)

ห้องสมุดภายนอก

หากคุณใช้ห้องสมุดภายนอกบางแห่งยังไม่สามารถใช้งาน PySide ได้ มีไม่มากที่คุณต้องทำงานกับ PySide เพื่อความซื่อสัตย์ แต่สองสามปีที่ผ่านมาฉันเขียนโค้ดที่ใช้บิด (กับเครื่องปฏิกรณ์ Qt) และ matplotlib และบังคับให้ฉันใช้ PyQt4 แทน PySide . ฉันคิดว่ามีโอกาสมากที่ห้องสมุดเหล่านี้จะได้รับการอัปเดตเพื่อรองรับทั้งสองตอนนี้ แต่ฉันยังไม่ได้ตรวจสอบ

การทำให้ Code ใช้งานได้กับ PyQt4 หรือ PySide

สมมติว่าคุณใช้ 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]

2
เนื่องจาก PySide ยอมรับวัตถุ Python ระดับสูงหลายครั้งฟังก์ชั่นตัวโหลด UI ของคุณสามารถทำให้บางอย่างเช่นreturn QtUiTools.QUiLoader().load(uifile)ถ่ายพา ธ โดยไม่ต้องใช้ QFile สำเร็จรูปใด ๆ
Chris Billington
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.