J'ai commencé à apprendre un peu de python et j'aimerais maintenant jouer un peu avec la construction de gui. Qt semble être un bon choix en raison de son multiplateforme.
Il semble maintenant y avoir deux liaisons disponibles: PyQt par Riverbank Computing et PySide, initialement développé par Nokia.
Alors, lequel dois-je choisir? Tout ce que je peux trouver, ce sont des comparaisons de fonctionnalités vieilles de deux ans, mais quelles différences y a-t-il de nos jours?
Lequel est le plus facile à utiliser, a une documentation plus/meilleure? Les deux sont-ils toujours en développement actif?
Les licences ne me préoccupent pas beaucoup car je n'ai pas l'intention d'écrire des applications commerciales.
Les deux boîtes à outils sont activement maintenues et sont désormais plus ou moins égales en fonctionnalités et en qualité. Il n'y a que peu de différences, plutôt sans importance.
Néanmoins, je recommanderais PySide pour Python 2. Il a une API plus raisonnable, principalement il n'expose pas les types Qt, qui ont un équivalent direct dans Python (par exemple QString, QList, etc.) ou qui sont complètement superflus en raison de la nature dynamique de Python, comme QVariant. Cela évite de nombreuses conversions fastidieuses vers et depuis les types Qt, et facilite ainsi la programmation et évite de nombreuses erreurs.
PyQt prend également en charge cette API moderne et l'utilise par défaut pour Python 3, mais pas pour Python 2 pour maintenir la compatibilité descendante.
Il y a aussi la différence de licence. PySide est LGPL tandis que PyQt est GPL. Cela pourrait faire une différence si vous ne souhaitez pas rendre votre projet open source. Bien que PyQt ait toujours la version propriétaire disponible pour un prix assez raisonnable.
J'ai tendance à trouver la documentation PySide plus intuitive. L'API, à mon avis, est légèrement plus Pythonic et le taux de corrections de bugs est assez impressionnant pour le moment.
PyQt a l'avantage de Python 3 support et historique. Il y a beaucoup plus de documentation/tutoriels tiers pour cela.
J'ai récemment porté une base de code importante (plus de 8 000 lignes de code) de PyQt vers PySide.
En ce moment, je dirais que PyQt est un projet beaucoup plus mature, performant et stable. J'ai rencontré un certain nombre de bogues dans PySide et je soupçonne que tout gros projet rencontrera des problèmes. Cela dit, j'ai signalé un bogue dans le projet et il a été corrigé et dans une nouvelle version en quelques semaines. J'ai également un problème où l'application prend environ 15 secondes pour se fermer. Je n'ai pas encore passé le temps de découvrir pourquoi. Cependant, ce n'est qu'une question de temps avant qu'il n'y ait aucune raison de choisir PyQt plutôt que PySide.
Si vous décidez d'utiliser PyQt pour l'instant, assurez-vous d'utiliser l'API v2 tout au long. Il s'agit d'une meilleure API et facilitera toute transition future vers PySide. De plus, si vous portez, suivez simplement les instructions sur le wiki PySide. Même pour une application 8+ kloc composée d'environ 20 fichiers source, il n'a fallu qu'un après-midi.
Bien qu'ils puissent avoir une interface similaire pour les classes Qt/C++, leur interface pour les macros Qt/C++ telles que signal/slot/propriété est très différente. Porter l'un à l'autre n'est pas une tâche facile. Il serait préférable de prendre la bonne décision au tout début.
Au-delà des différences de grammaire/licence, je veux juste souligner une déficience de PyQt dans la liaison de langage, qui pourrait être essentielle pour écrire un projet QML en Python. Ces différences me poussent finalement vers PySide depuis PyQt.
qmlRegisterType
qmlRegisterType est essentiel pour créer une liaison C++ d'exécution avec QML. Dans PySide, il fait partie de PySide.QtDeclarative. Et cela fonctionne assez bien avec Python.
Dans PyQt, qmlRegisterType n'existe pas. Et je n'ai pas pu trouver une autre approche. Je sais qu'une tâche simple pourrait être effectuée en définissant le contexte QML. Mais si vous avez vraiment besoin d'une liaison d'exécution avec qmlRegister et Q_INVOKABLE, je pense que PySide est le seul choix pour le moment.
Shiboken VS SIP
Les deux peuvent encapsuler Qt/C++ dans python. Pour Shiboken, je pense que c'est plus simple et nécessite moins de codage. Il suffit de créer un système xml de système comprenant le NOM des classes vous voulez exporter, et c'est tout. Shiboken ne nécessite pas de descriptions manuelles supplémentaires pour la structure des classes cibles.
Pour SIP, il faudrait plus de codage supplémentaire. Nous devrons créer un fichier SIP qui réimplémente presque tout l'en-tête C++. Il nécessite non seulement le NOM de la classe, mais aussi le DÉTAILS de quelles méthodes les classes cibles ont. Si la classe C++ est bien conçue en utilisant Pimp et que nous voulons exporter toutes les méthodes en elle, SIP devrait fournir un moyen d'exporter automatiquement toutes les classes ce qu'elle ne peut pas faire pour le moment. Cela ajouterait également la charge de maintenir la cohérence entre les en-têtes SIP et C++).
Mais je dois dire que la documentation de Shiboken sur Qt wiki est très mauvaise et trompeuse. La création de Python avec Shiboken sous Windows ne nécessite pas nécessairement CMake du tout. generatorrunner n'est pas non plus nécessaire. J'utilise uniquement un cmd windows script pour appeler shiboken, et un qmake pro pour compiler le plugin cible.
Un fait important est que PyQt4 a deux versions de ses API pour certaines choses. Les éléments de la version 1 sont des choses telles que l'utilisation de QString
au lieu de unicode
et QVariant
(fondamentalement juste un wrapper, je crois - je n'ai jamais fait quoi que ce soit qui l'utilise) au lieu de cela enveloppé. La version 2, qui peut être activée dans Python 2 et qui est activée dans Python 3, est bien meilleure (bien qu'elle soit toujours impythonique dans de nombreux endroits - PySide l'est aussi, mais ça va nettement mieux. Il y a encore des incompatibilités avec eux: PyQt4 a QtCore.pyqt(Signal|Slot|Property)
, PySide a QtCore.(Signal|Slot|Property)
.
Pour mon propre projet, j'ai décidé de prendre en charge les deux sans modifier le code. Je préfère PySide, mais sur Windows je distribue avec PyQt4 car actuellement il est un peu plus petit pour la distribution à l'heure actuelle. Ma solution est de vérifier PySide et s'il est là, insérez un crochet d'importation pour rediriger les importations PyQt4 vers PySide, ou si ce n'est pas le cas, corrigez PyQt4 pour qu'il fonctionne comme il se doit.
Les fichiers utilisés:
Ensuite, vous n'avez que import pyqt4pysideimporter
Et pyqt4pysideimporter.autoselect()
(comme dans main.py
Dans ce référentiel). Et après cela, vous pouvez simplement import PyQt4
.
Mis à part: il a également été déclaré il y a quelques jours sur la liste de diffusion PySide qu'ils prévoyaient de prendre en charge Python 3 entièrement au cours des prochains mois.
J'ai une ligne de 20k Python que j'ai essayé de convertir en PySide sans succès. La conversion est facile et la plupart des fonctionnalités fonctionnent. Il existe plusieurs méthodes qui ne sont pas implémentées car elles sont "obsolètes", j'ai donc dû les corriger. C'était correct. Sous Windows, avec PySide-1.1.2, l'opérateur '==' n'est pas implémenté pour de nombreux objets Qt. Une solution consiste à dire: "if id (item1) == id (item2): ". L'autre observation est que PySide semblait sensiblement plus lent. Je n'ai pas isolé PySide comme cause de la lenteur, mais le problème a disparu quand je suis revenu à PyQt.
Enfin, pour l'instant, le kit Android avec PySide ne semble pas prêt pour les heures de grande écoute.