چرا دو رابط (Binding) برای Qt پایتون وجود دارد؟
هنگام خواندن این مقاله، احتمالاً در مورد اینکه چرا دو رابط پایتون برای فريمورک Qt GUI وجود دارد، سردرگم خواهید شد. برای درک این پدیده باید نگاهی به تاریخچه Qt بیندازیم.
PyQt زمان زیادی است که وجود دارد و توسطRiverbank Computing Limited ، یک شرکت مشاوره کوچک پشتیبانی میشود. در زمانی که Qt متعلق به نوکیا بود، این کمپانی تصمیم گرفت PySide (رابط Qt خود) را ایجاد کند. دلیل این امر اين بود که PyQt تحت مجوز GPL و مجوز تجاری است.
هم رویش منتشر کرده است:
آموزش پایتون از صفر --- برنامه نویسی مقدماتی تا پیشرفته Python
بعدها نوکیا توسط مایکروسافت خریداری شد و Qt که عمدتاً برای توسعه رابطهای کاربری گرافیکی برای سیمبین استفاده میشد، به دیجیا فروخته شد. از آن زمان، PySide صرفاً توسط جامعه متنباز پشتیبانی میشد.
کریستین تیسمر کار روی پشتیبانی Qt5 در PySide2 را در سال 2015 برای AutoDesk انتخاب کرد و اولین نسخه قابل استفاده را ایجاد کرد. در سال 2016، این پروژه به صورت داخلی توسط شرکت Qt انتخاب شد.
سال 2018، پشتیبانی از PySide2 به طور رسمی توسط شرکت رسمی پشتیبان Qt، اعلام شد. در نهایت در آخر سال 2018، اولین نسخهQt For Python، با نام جدید PySide2 منتشر شد.
تفاوت Pyside و Pyqt
در بیشتر موارد، PyQt5 و PySide2 بسیار شبیه هستند. Qt for Python API حتی برای سازگاری با PyQt5 طراحی شده است. علاوه بر این، قصد داریم تفاوت را در زمینههای زیر به تفصیل توضیح دهیم.
- مجوز
- کامل بودن API
- ابزار
- جامعه و پشتیبانی
- مولد انقیاد
1- مجوز
مهمترین تفاوت بین PyQt5 و PySide2 مجوز است. PyQt5 تحت GNU GPL v3 و مجوز تجاری Riverbank منتشر شده است. PySide تحت LGPL v3 و مجوز تجاری Qt در دسترس است.
هزینه مجوز تجاری PyQt5 با پشتیبانی یکساله 550 دلار است. قیمت مجوز تجاری Qt بسته به اندازه شرکت و درخواست متفاوت است.
این برای برنامه ما چه معنایی دارد؟ هنگامی که میخواهید یک برنامه کاربردی متنباز بسازید که میتواند در پروژههای تجاری متنبسته (close source) استفاده شود، ممکن است مهم باشد که کتابخانههای وابستگی از GPL استفاده نمیکنند.
هم رویش منتشر کرده است:
آموزش PyQt5 -- پای کیوت مقدماتی تا پیشرفته همراه پروژه
وقتی روی یک برنامه تجاری کار میکنید، مهم است که GPL،LGPL یا هر یک از مجوزهای تجاری را انتخاب کنید. با GPL باید کد منبع برنامه خود را منتشر کنید و مهمتر از آن، برنامه شما نیز باید تحت مجوز سازگار با GPL مجوز داشته باشد. برای اکثر برنامههای تجاری این مورد غیر قابل قبول است.
با این حال، LGPL این امکان را میدهد که برنامه متنبسته (close source ) خود را به همراه دستورالعملهایی در مورد نحوه جایگزینی کتابخانه توزیع کنید، اما GPL اجازه میدهد تا درخواست خود را بدون نیاز به هیچ دستورالعملی توزیع کنید. این امر مخصوصاً برای دستگاههای تعبیهشده مهم است، زمانی که میخواهید دسترسی کاربران به سیستم فایل را قفل کنید.
با این حال، توجه داشته باشید که مجوز تجاری Riverbank فقط برای رابط پایتون و نه خود Qt قابل اعمال است. بنابراین اگر قصد قفل کردن برنامه خود را دارید، ممکن است نیاز به خرید مجوز تجاری برای Qt داشته باشید.
بنابراین، به نظر، Qt For Python یا همان PySide در هنگام صدور مجوز به شدت برنده است.
2- ابزارها و افزونه ها
هنگام مقایسه PyQt و PySide، ابزارهایی که با رابط پایتون Qt همراه هستند به ندرت مورد بحث قرار میگیرند.
PyQt با طیف وسیعی از ابزارها همراه است. یکی از جالبترین آنها ابزار pyqtdeploy است که ادعا میکند میتواند برنامههای PyQt را برای ویندوز، لینوکس، OS X، اندروید و حتی iOS پیادهسازی کند.
علاوه بر این، PyQt دارای افزونهها و کتابخانههای اضافی از جمله QScintilla2 و dip است. به نظر میرسد اکثر کتابخانهها روی استفاده از ویجتهای Qt متمرکز شده اند.
PySide2 در حال حاضر هیچ ابزار استقرار اختصاصی ندارد.
در اینجا PyQt برنده است. با این حال، اگر از اتصال پایتون برای کار با Qt Quick استفاده کنید، تفاوت ممکن است ناچیز باشد.
3- کامل بودن API
وقتی صحبت از API به میان میآید، PyQt5 بسیار شبیه PySide2 است. با این حال، هر دو رابط دارای نقصهایی هستند.
PySide هنوز نسبتاً جدید است، و بنابراین، برخی از توابع ضروری API، از جمله qmlRegisterSingletonType را ندارد.
به طور کلی، بنظر PyQt5 برندهی قیاس کامل بودن API است.
4- انجمن و پشتیبانی
یکی از عوامل مهم در انتخاب یک پروژه متنباز یا هر کتابخانه وابستگی نسبت به دیگری، جامعه و پشتیبانی پشت پروژه است.
در اینجا PyQt و PySide تفاوت چشمگیری دارند. از دیدگاه جامعه، PyQt احتمالاً دارای اجتماع بزرگتری است. با این حال، به نظر میرسد که روند توسعه چندان باز نیست و توسط یک نهاد واحد هدایت میشود.
PySide بیشتر جامعه را از روزهای نوکیا از دست داده است، اما از آنجایی که بهعنوان رابط رسمی Qt برای پایتون انتخاب شده است، به احتمال بسیار زیاد جامعه به سرعت به دنبال آن خواهد رفت. فرآیند توسعه باز و بسیار نزدیک به فرآیند توسعه Qt است.
پشتیبانی تجاری PyQt ارزانتر از پشتیبانی تجاری PySide است. با این حال، کیفیت حمایت ارائه شده، نامشخص است. از طرف دیگر شرکت Qt میتواند برای انواع مشتریان از جمله مشاوره پروژه محور و پشتیبانی در محل، را ارائه دهد.
همچنین توجه به این واقعیت مهم است که شرکت پشتیبان پای کیوت، Riverbank Computing، یک شرکت کوچک است.
PySide به وضوح برنده این امتیاز است.
5- سازنده انقیاد (Binding Generator)
اگر قصد دارید به یک کتابخانه اضافی C یا ++C از پایتون دسترسی داشته باشید، انتخاب سازنده انقیاد پایتون ممکن است به شما کمک کند.
PyQt با سازنده انقیاد SIP همراه است.
PySide با سازنده انقیاد Shiboken ارائه میشود.
مهمترین تفاوت این است که اتصالات تولید شده توسط Shiboken میتوانند هر نوع ورودی را بپذیرند، در حالی که اتصالات تولید شده SIP فقط انواعی را میگیرند که توسط خود SIP شناخته میشوند.
علاوه بر این، از SIP میتوان برای تولید پیوندهای پایتون برای C و همچنین C++ libs استفاده کرد. از طرف دیگر، Shiboken برای کار با ++C طراحی شده است.
نحوه ایجاد پیوندهای سفارشی با SIP و Shiboken به شدت متفاوت است. بیایید به یک مثال کوتاه نگاهی بیندازیم.
// Define the interface to the word library.
class Word {
const std::strin the_word;
public:
Word(const std::string &w);
std::string reverse() const;
};
مشخصات SIP به صورت زیر است:
// Define the SIP wrapper to the word library.
%Module word
class Word {
%TypeHeaderCode
#include <word.h>
%End</word.h>
public:
Word(const std::string &w);
std::string reverse() const;
};
همانطور که میبینید، کد مشخصات SIP عمدتاً Copy-Paste کد واقعی ++C است. مهمتر از همه، هر عملکردی که باید در معرض دید باشد باید تعریف شود.
کد شیبوکن به صورت زیر است:
#ifndef BINDINGS_H
#define BINDINGS_H
#include "word.h"
#endif // BINDINGS_H
<!--?xml version="1.0"?-->
<typesystem package="Universe">
<primitive-type name="std::string">
<object-type name="Word">
</object-type>
</primitive-type></typesystem>
یک فایل هدر bindings و یک فایل XML داریم که نوع سیستم را مشخص میکند. Shiboken توابع API را به طور خودکار از کد ++C تولید میکند.
انتخاب سازنده انقیاد ممکن است ترجیح شخصی باشد. با این حال، از نقطه نظر تعمیر و نگهداری، PySide در این نبرد پیروز است.
Wrappers
PyQt و PySide هر دو مزایا و معایب خود را دارند. از ابتدای سال 2019، انتخاب بین PySide2 و PyQt آسان نبوده است. خوشبختانه، APIهای PyQt و PySide بسیار شبیه هستند. چند پروژه در حال حاضر از این واقعیت استفاده میکنند و یک لایه انتزاعی کوچک را بر روی هر دو کتابخانه ارائه میدهند.
- QtPy
- python_qt_binding
- Qt.py
- jupyter
- QtExt
محبوبترین Wrapper احتمالا QtPy است.
نتیجه
در این پست، با تفاوتهای بین PyQt5 و PySide2 معروف به Qt For Python آشنا شدید. مقایسه مزایا و معایب، تصمیمگیری در مورد انتخاب رابط پایتون برای Qt را برای شما آسانتر میکند.
اگر نمیخواهید روی یکی یا دیگری سرمایهگذاری زیادی کنید، میتوانید از یکی از Wrapperهای موجود استفاده کنید.
کلیدواژگان
تفاوت pyside و pyqt | مقايسه PyQt و PySide | تفاوت پای کیوت و پای ساید | تفاوت Qt For Python و pyqt | کتابخانهpyqt | پای کیوت چیست | پای کیوت | pyqt چیست | شرح pyqt | کار با pyqt | فریم ورک pyqt | ویژگی pyqt | فرق pyqt با pyside | فرق pyside و pyqt | فرق پای ساید با پای کیوت | فرق pyside با pyqt
منبع
pyqt vs qt for python pyside2 pyside
دوره های آموزشی مرتبط
- آموزش برنامه نویسی اندروید با کاتلین و استاندارد گوگل (بسته جامع) ۳۱۹,۰۰۰ تومان
- آموزش سایتون -- افزایش سرعت پایتون با Cython ۷۸,۰۰۰ تومان