Pourquoi n'y a-t-il pas plus d'applications de bureau écrites avec Qt? [fermé]

202

Autant que je sache et que j'ai compris dans mon expérience avec Qt, c'est une très bonne bibliothèque et facile à apprendre. Il a une API très bien conçue et est multi-plateforme, et ce ne sont que deux des nombreuses fonctionnalités qui le rendent attrayant. Je suis intéressé de savoir pourquoi plus de programmeurs n'utilisent pas Qt. Y a-t-il une déficience qui parle contre elle? Quelle fonctionnalité rend les autres bibliothèques meilleures que Qt? Le problème est-il lié aux licences?

Déshumaniseur
la source
60
C'est C ++ natif. La plupart des développeurs préféreraient des langages de niveau supérieur tels que C #.
user16764
15
L’épée à double tranchant de la compatibilité ascendante a laissé à Qt de nombreux anachronismes, défauts non corrigibles et autres mauvais comportements.
edA-qa mort-ora-y
26
@ user16764: "La plupart"?
Courses de légèreté en orbite le
17
Je ne pense pas que l’indice TIOBE soit une mesure vraiment précise, car il mesure la popularité, pas l’utilisation. Comparer la quantité de code dans des référentiels open source tels que GitHub, Bitbucket, Codeplex et Sourceforge donnerait des mesures plus précises. (Et je pense que ces mesures plus précises placent C et C ++ dans les positions n ° 1 et n ° 2 - Java a un avantage injuste dans l'indice TIOBE car il est utilisé pour les cours de premier cycle, et les nouveaux programmeurs génèrent plus de buzz que ceux expérimentés)
Billy ONeal
12
@Giorgio: Euh, vous devez penser à de telles choses en C #. Le concept de "qui possède ceci" va bien au-delà de "qui appelle delete". Le fait que les pointeurs intelligents rendent cela explicite n’est pas un défaut de la langue; et si vous ne pensez pas à de telles choses, vous allez générer des ordures dans n'importe quel langage de haut niveau que j'ai aussi vu.
Billy ONeal

Réponses:

177

Je ne veux pas vraiment que ce soit une réponse critique, mais ce sont les raisons pour lesquelles je n'utilise pas personnellement Qt. Il y a beaucoup de bonnes choses à dire à ce sujet, à savoir que l'API fonctionne la plupart du temps et qu'elle relie de manière transparente les plateformes. Mais je n'utilise pas Qt, car:

  1. Dans certains cas, les programmes natifs ne ressemblent pas. Concevoir une interface utilisateur unique pour toutes les plates-formes ne va pas forcément bien paraître lorsqu'il est déplacé de machine en machine, pour diverses raisons de style visuel. Par exemple, sur les machines Mac, les barres divisées sont généralement relativement épaisses et les boutons sont petits et arrondis avec des icônes. Sur les machines Windows, les barres divisées sont généralement étroites et les boutons sont plus textuels, avec des motifs plus carrés. Ce n’est pas parce que vous pouvez écrire une interface utilisateur pour chaque plate-forme que vous devriez le faire pour la plupart des applications.
  2. Qt n'est pas une bibliothèque C ++. Cela nécessite une étape de compilation séparée, ce qui rend le processus de construction beaucoup plus compliqué par rapport à la plupart des autres bibliothèques.
  3. En conséquence de (2), les IDE et les outils C ++ peuvent marquer les expressions Qt comme des erreurs, car ils ne comprennent pas les spécificités de Qt. Cela force presque l'utilisation de QtCreator ou d'un éditeur textuel comme vim.
  4. Qt est une grande quantité de source, qui doit être présente et préinstallée sur toute machine utilisée avant la compilation. Cela peut rendre la création d'un environnement de construction beaucoup plus fastidieuse.
  5. Il est disponible uniquement sous LGPL, ce qui rend difficile l'utilisation d'un déploiement à un seul binaire lorsqu'il est nécessaire de publier sous une licence plus restrictive ou moins restrictive.
  6. Il produit des binaires compilés extrêmement volumineux par rapport aux "applications natives standard" écrites de la même façon (à l'exception des applications écrites pour KDE).
Billy Oneal
la source
11
@Dehumanizer: Il y a la licence LGPL et la licence commerciale. La licence commerciale représente des milliers de dollars de la part du titulaire de la licence, elle ne permet pas la redistribution, etc. Pour les projets open source sous licences libérales comme BSD, MIT ou Boost, où les auteurs ne gagnent pas beaucoup d'argent et souhaitent pour libérer leur code sous une licence libérale, une dépendance à la LGPL est déraisonnable, mais les développeurs en question ne peuvent généralement pas se permettre une licence commerciale.
Billy ONeal le
27
# 6 est la principale raison pour laquelle je l'évite. Je veux dire, je ne veux pas d'un programme lourd et maladroit, et je n'aime pas être lié à une licence spécifique, mais c'est vraiment le manque d'une bonne apparence locale qui me fait mal. Les versions récentes d'OSX et de Windows ont particulièrement fait un travail fantastique en rendant leurs interfaces natives jolies, rapides et fonctionnelles, et je préfère exploiter tout le travail qu'elles ont déjà effectué pour moi. Je trouve que beaucoup de programmes sans look autochtone se sentent bon marché et bidouilles pour moi (pas toujours, mais cela me dérange un peu).
Greg Jackson
16
Votre numéro 6 aurait dû être le numéro 1. C'est de loin le plus gros problème avec Qt. Dans de nombreux cas, les API natives ne sont tout simplement pas utilisées. J'aime que mon logiciel ait l'air natif. Les utilisateurs aiment ça aussi. Je n'ai jamais vu une application Mac créée avec Qt qui ressemblait à une application Mac. Ni les autres utilisateurs de Mac, et ils sont difficiles sur ce genre de chose. Vous perdez tous les avantages d'être «multiplateforme» si vous ne l'utilisez que pour créer des applications Linux, ce qui est à peu près le seul endroit où il semble natif car il n'y a vraiment rien.
Cody Grey le
41
sauf que le problème du look 'natif' n'est plus là. L'ancienne cohérence des applications Windows consiste désormais à bastardiser tous les blobs, lueurs et animations uniques laissées par WPF et Silverlight. Jetez un coup d'œil au panneau de configuration d'Office ou de Windows 7 pour voir comment même le produit phare de MS possède une interface graphique incohérente. Utilisateurs de Mac - eh bien, vous avez un point très valable ici.
gbjbaanb
5
@ TrevorBoydSmith: Désolé, mais vous vous trompez. Qt est le seul framework qui utilise le prétraitement. Période. Vérifiez GNOME, FLTK, WX et vos amis, et montrez-moi une étape de prétraitement. Vous n'en trouverez pas. Certaines autres bibliothèques sont livrées avec différents systèmes de construction, mais en fin de compte, ce sont des bibliothèques C ++ qui peuvent être construites par n'importe quel compilateur C ++. Quant à "Raw win32 non présent dans mes motifs", il est présent dans mes motifs en tant que n ° 5 et n ° 6.
Billy ONeal
115

Comme on dit, chaque outil correspond à chaque problème et à chaque situation ...

Mais si vous êtes programmeur C ++, Qt est votre framework. Pas de rival.

Nous développons une application commerciale complexe pour l'imagerie médicale, et Qt tient bon.

Je ne dis pas que les «inconvénients» que les gens disent à ce sujet sont faux, mais j’ai le sentiment qu’ils n’ont pas essayé Qt depuis longtemps (cela s’améliore continuellement à chaque nouvelle version ...), et surtout tous les problèmes qu'ils commentent ne sont pas un problème si vous prenez soin de vous.

Incohérence de la plate-forme d'interface utilisateur: uniquement si vous utilisez les widgets d'interface utilisateur "tels quels", sans personnalisation ni art personnalisé.

Surcharge du préprocesseur Qt: uniquement si vous abusez du mécanisme signal-slot, ou de l'héritage QObject, lorsqu'il n'y en a pas vraiment besoin.

En passant, nous écrivons toujours des applications en C # .NET et le faisons depuis longtemps. Donc, je pense avoir une perspective enouch.

Comme je l'ai dit, chaque outil pour chaque situation,

mais Qt est sans aucun doute un cadre cohérent et utile.

Inigo
la source
9
+1 Thaks! Je voulais juste écrire le même. Le plus absurde est "l'argument non open source / commercial". Étonnante, à quel point de nombreuses personnes comprennent le terme Open-Source. Qt était Open-source depuis que je l’utilise (1.4). Et il possédait la licence la plus juste: gagner de l'argent avec Qt -> pay.
Valentin Heinitz
16
Oh , et je ne se soucient pas de l' ajout de 10 Mo DLL à l' application contenant 50 Mo d'art et 200 plus de tutoriels MBs vidéo et données :)
Петър Петров
9
L'espace nécessaire pour Qt est bon marché ces jours-ci.
trusktr
5
Cela correspond assez bien à mon expérience avec Qt (le framework de widgets, je n’ai jamais utilisé QML / QtQuick pour des problèmes sérieux). Il est approprié d’écrire des applications volumineuses avec des exigences d’interface utilisateur complexes. Une fois que vous l'apprenez, vous pouvez être très productif. Les inconvénients mentionnés (étape de compilation distincte pour la migration, fichiers ui, etc.) ne posent pas de problème si le système de compilation est correctement configuré. Je peux recommander soit qmake ou cmake.
Nils
A partir de Qt 5.8, il existe un projet nommé Qt Lite qui minimise extrêmement Qt pour vos besoins spécifiques. c'est une fonctionnalité commerciale;)
SMMousavi
36

De toutes les choses que je n'aime pas chez Qt, le fait qu'il ne fonctionne pas bien avec les modèles me gène le plus. Vous ne pouvez pas faire ça:

template < typename T >
struct templated_widget : QWidget
{
  Q_OBJECT;

public signals:
  void something_happened(T);
};

De plus, il ne fonctionne pas bien avec le préprocesseur. Vous ne pouvez pas faire ça:

#define CREATE_WIDGET(name,type) \
struct name ## _widget : QWidget \
{ \
  Q_OBJECT; \
\
public signals: \
  void something_happened(type); \
}

Cela, ajouté au fait que tout ce qui répond à un signal doit être un Q_OBJECT, rend Qt difficile à travailler pour un programmeur C ++. Les gens habitués à la programmation de style Java ou Python sont probablement meilleurs en réalité.

En fait, j'ai passé beaucoup de temps et d'efforts à rechercher et à concevoir un moyen de récupérer la sécurité de type et de connecter un signal Qt à n'importe quel objet foncteur: http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals -in-qt-step-1.html

Le genre de chose que je veux faire ici est le développement de base du C ++ quotidien rendu quasiment impossible par le Qt moc ... ce qui en soi est tout à fait inutile maintenant, si jamais il l’a été.

Franchement, je suis coincé avec ça parce que si vous voulez faire des tests d’interface utilisateur automatisés, Qt est quasiment le seul jeu en ville à part le MFC ... qui date de 1980 (ça craint de travailler très dur dans cette merde). Certains pourraient dire WX mais cela pose des problèmes encore plus graves. GTKmm aurait été mon premier choix, mais étant donné que tout est dessiné par le propriétaire et ne rend pas l'accessibilité… ne peut pas être piloté par un logiciel de test standard. Qt est assez difficile à cet égard ( fonctionne à peine lorsque vous modifiez le plug-in d'accessibilité).

Edward Strange
la source
1
Par intérêt, quels sont, selon vous, les principaux problèmes de WX?
Tom Anderson
7
@Tom - documentation médiocre, en particulier pour les nouveautés. Les composants AUI sont à peine documentés avec de grandes sections manquantes, ce qui rend leur utilisation difficile dans un environnement de production. La documentation du processus de l'événement est fondamentalement erronée en ce qui concerne le chemin suivi, au moins sur win32. J'ai passé beaucoup de temps à crier après l'ordinateur: "Cela devrait fonctionner !!!" avant de me lancer dans le code de traitement en profondeur pour savoir que ce que fait WX ne suit pas la documentation et que ce que je faisais ne fonctionnerait JAMAIS.
Edward Strange le
1
J'ai également été perturbé par l'acceptation de la bibliothèque de grille de propriété dans la ligne principale. J'ai utilisé cette bibliothèque et elle a montré de nombreuses failles de conception fondamentales ainsi qu'un manque réel de connaissances de la part du programmeur qui l'a écrite (fonctions virtuelles dans les constructeurs, par exemple). Cela, ainsi que le piètre état d’AUI, ont montré une tendance à la dégradation des normes. Je ne suis pas non plus un grand fan des tables d’événements statiques, même s’il existe au moins une autre façon de réagir aux événements ... contrairement au MFC, dont le format WX est tout simplement trop excitant.
Edward Strange le
Merci. Je ne l'ai que très peu utilisé, et via l'API wxPython, où cela semblait plutôt sympa. Je peux comprendre que cela cacherait une partie de la perversité, mais aussi que je ne suis tout simplement pas assez impliquée pour me heurter aux problèmes les plus graves. Quelque chose dont je devrais être conscient.
Tom Anderson
1
tout ce qui répond à un signal doit être un Q_OBJECT, pas aujourd'hui ... Maintenant, les fonctions statiques, les fonctions et même les fonctions lambda peuvent répondre à un signal (vous pouvez utiliser les pointeurs de fonction comme slots). Les classes No-QObject peuvent également avoir des logements de membre si vous vous y connectez à l'aide de std :: bind pour convertir le membre d'instance en pointeur de fonction.
Vinícius A. Jorge
28

Une des raisons de ne pas utiliser Qt est que si vous écrivez pour une seule architecture, telle que Windows, vous pouvez utiliser C # / .NET (ou Cocoa sur Mac), car ils seront invariablement en mesure de tirer parti des dernières sonneries et outils. -les sifflets de l'OS.

Si vous écrivez des applications multiplates-formes, il est possible que vous soyez déjà fortement investi dans une autre technologie telle que Java (c'est-à-dire que vous travaillez dans un "Java Shop"). Votre choix de technologie peut être dicté par l'écosystème dans lequel vous développez, tels que les API spécifiques à une langue. Dans ce type de cas, réduire le nombre de technologies peut être bénéfique.

Une troisième raison à laquelle je peux penser est que Qt est basé sur C ++ et que C ++ est un langage relativement difficile / dangereux dans lequel programmer. Je pense que c'est un langage pour les professionnels. Si vous avez besoin d’être performants et d’être méticuleux, le C ++ est probablement toujours le meilleur jeu en ville. En fait, Qt élimine beaucoup de problèmes de gestion de la mémoire si les choses tombent hors de portée. De plus, Qt lui-même fait du bon travail en isolant l'utilisateur de la plupart des problèmes C ++ méchants. Chaque langue et chaque cadre a ses avantages et ses inconvénients. C’est une question très, très compliquée qui peut généralement être résumée par l’addage souvent observé chez les convives: vitesse, qualité et prix (mais vous ne pouvez en choisir que deux).

Bien que les règles me disent que je devrais rester concentré sur la réponse à la question, je souhaite réfuter certaines des questions soulevées par Billy ONeal, qui, à mon avis, résume bien les raisons couramment invoquées pour ne pas utiliser Qt:

  1. Qt est en effet un fichier bibliothèque / framework / en-tête C ++. Il est augmentépar un macro processeur (moc) qui active les signaux et les slots, entre autres. Il transforme des macro-commandes supplémentaires (telles que Q_OBJECT) afin que les classes disposent d'une introspection et de toutes sortes d'autres avantages que vous pourriez penser d'ajouter des fonctionnalités Objective-C à C ++. Si vous en savez assez sur le C ++ pour être choqué par ce manque de pureté, c'est-à-dire que vous êtes un pro, alors 1) n'utilisez pas Q_OBJECT et ses semblables ou 2) soyez reconnaissant qu'il le fasse, et programmez-vous dans les cas très limités. où cela pose un problème. Pour les gens qui disent "Utilisez Boost pour les signaux et les slots!" alors je voudrais rétorquer que vous échangez un "problème" pour un autre. Boost est énorme, et il a ses propres problèmes fréquemment cités, tels qu'une documentation médiocre, des API épouvantables et des horreurs multi-plateformes (pensez aux anciens compilateurs comme gcc 3.

  2. Pour le support de l'éditeur, cela découle également de 1, je suis un peu d'accord. En fait, Qt Creator est à mon humble avis le meilleur éditeur C ++ graphique, même si vous n’utilisez pas le logiciel Qt. Beaucoup de programmeurs professionnels utilisent emacs et vim. De plus, je pense qu'Eclipse gère la syntaxe supplémentaire. Ainsi, aucun problème avec les macros Qt (Q_OBJECT) ou les ajouts de signaux / slots. Vous ne trouverez probablement pas ces macros dans Visual Studio, car (je le concède), elles constituent des ajouts à C ++. Mais dans l’ensemble, les utilisateurs de C # / .NET ne vont pas utiliser Qt de toute façon, car ils disposent de nombreuses fonctionnalités couvertes par leurs propres techniques propriétaires.

  3. Quant à la taille de la source Qt, tant qu'elle compile du jour au lendemain, qui s'en soucie? J'ai compilé Qt 4 sur mon Macbook dual core en "moins qu'une nuit". J'espère certainement que ce n'est pas ce qui motive votre décision d'utiliser ou non une technologie particulière. Si cela pose vraiment un problème, vous pouvez télécharger les SDK précompilés pour Mac, Linux et Windows à partir du site Web de Qt.

  4. La licence est disponible en trois choix: 1) Licence propriétaire au cas où vous voudriez modifier Qt lui -même et ne pas partager, ou cacher le fait que quelqu'un utilise Qt et ne veut pas donner d'attribution (pourrait être très important pour la stratégie de marque et l'image!) 2 ) GPL et 3) LGPL. Oui, il y a des problèmes avec la liaison statique (rouler tout Qt dans le binaire) - mais je pense que c'est plus parce qu'on ne peut pas jeter un coup d'œil à l'intérieur et remarquer que vous utilisez Qt (attribution!). J'ai essayé d'acheter une licence propriétaire auprès de Digia et ils m'ont dit "pour ce que vous faites, vous n'en avez vraiment pas besoin". Sensationnel. D'une entreprise qui vend des licences.

  5. La taille du fichier binaire / bundle est due au fait que vous devez distribuer le contenu Qt aux personnes qui ne l’ont pas: Windows en a déjà? le truc Visual Studio ou vous devez installer le run-time. Mac vient déjà avec l'énorme Cocoa et peut être lié dynamiquement. Bien que je ne fasse pas beaucoup de distribution, je n'ai jamais rencontré de problème avec la distribution du fichier statique de ~ 50 mégaoctets (que je peux rendre encore plus petit avec certains utilitaires d'extraction / compression binaires comme UPX). Cela ne me concerne pas assez, mais si la bande passante était un problème, j'ajouterais une étape UPX à mon script de construction.

  6. Qu'est-ce qui définit "l'apparence et la sensation des autochtones"? Je pense que "la plupart" conviendraient que Mac se rapproche le plus de l'apparence et de la convivialité. Mais je suis assis ici, regardant Safari, iTunes, Aperture, Final Cut Pro, Pages, etc., et ils ne se ressemblent pas, même s'ils sont fabriqués par le fournisseur du système d'exploitation. Je pense que l'aspect "toucher" est plus pertinent: style des widgets, réactivité, etc. Si vous vous souciez de la réactivité, voici une bonne raison d'utiliser le langage C ++ plutôt que Java, ou un autre langage très dynamique. (L'Objectif C bascule aussi, mais j'essaie de dissiper les mythes au sujet de Qt)

En résumé, c'est une question compliquée. Mais j'aimerais souligner que je pense qu'il y a moins de raisons de "ne pas utiliser Qt", comme on pourrait le penser, en se basant sur des mythes et des informations obsolètes depuis une décennie.

Eric Brown
la source
1
Ce que je ne comprends pas, c'est pourquoi ces bibliothèques multiplateformes ne sont pas simplement des fonctions d'emballage, voire mieux; si defs autour de Cocoa, Win32, KDE / Gnome fonctionne, assurant la meilleure interface utilisateur, avec toutes ses fonctionnalités.
MarcusJ
2
@MarcusJ Écrire une enveloppe autour d'une boîte à outils est clairement non trivial, peu importe 4 ou plus - mais si vous pensez que c'est aussi simple que cela, n'hésitez pas à essayer. En ce qui concerne l’idée que cela pourrait être réalisé en utilisant uniquement un prétraitement conditionnel ... vous devez être en train de plaisanter, non?
underscore_d
@MarcusJ libui est exactement cela (bien que sans le support de KDE).
Demi
Je veux ajouter que vous pouvez maintenant utiliser Qt / QML avec .NET. Vous n'avez pas besoin de toucher C ++. github.com/qmlnet/qmlnet PS: je suis l'auteur.
Paul Knopf
26

Une partie de cela est une licence. Voir https://en.wikipedia.org/wiki/Qt_(software)#Licensing pour consulter l'historique des licences. Jusqu'en 2000, les personnes qui s'intéressaient beaucoup à l'open source n'utilisaient pas Qt. Période. (C’était en fait la motivation initiale du développement de Gnome.) Jusqu'en 2005, les personnes qui souhaitaient pouvoir publier un logiciel libre pour Windows n’utilisaient pas Qt. Même après cette date, les personnes qui recherchaient des logiciels libres sous une licence autre que la GPL n’avaient tout simplement pas la possibilité d’utiliser Qt. Ainsi, tout projet de logiciel libre plus ancien que ces dates ne pourrait utiliser Qt. Et, bien sûr, les personnes écrivant du code propriétaire devaient payer pour ce privilège.

De plus, ce n’est pas comme s’il y avait pénurie d’autres options. Par exemple, WxWidgets , GTK + et Tk sont tous des toolkits multi-sources open source.

En outre, pendant longtemps, Windows était si dominant sur le bureau que beaucoup de logiciels ne contenaient que Windows. Si vous installez la chaîne d’outils de Microsoft, il est plus facile d’utiliser les éléments propriétaires de Microsoft que de s’inquiéter de quoi que ce soit, et beaucoup de programmeurs l’ont fait.

billy
la source
1
@btilly: GTK + est multi-plateforme. Par exemple, le client de messagerie instantanée Pidgin est écrit sur GTK +.
Billy ONeal le
1
Ok, cependant, il est possible "en quelque sorte" de fonctionner sur Windows :)
Dehumanizer
6
Installez simplement GIMP sous Windows et jetez un coup d'oeil.
user281377
2
Oui, et GIMP fonctionne bien sous Windows, mais il ne correspond certainement pas à l'apparence de l'interface utilisateur de Windows 7.
Alan B
5
Pidgin est probablement un meilleur exemple de GTK sous Windows. Cela ne fait rien d'extraordinaire, mais cela convient et dure depuis peut-être 10 ans ou plus?
Brendan Long
14

Je suis d'accord avec presque toutes les raisons évoquées ci-dessus, mais beaucoup de personnes ici ont déclaré qu'elles n'utiliseraient pas Qt à cause des frais généraux supplémentaires que cela entraîne. Je ne suis pas d'accord avec cela parce que tous les langages les plus courants aujourd'hui (Java, C # et Python) sont eux-mêmes assez lourds.

Deuxièmement, Qt rend la programmation avec C ++ tellement facile et directe qu’elle compense les ressources supplémentaires qu’elle utilise. J'ai rencontré pas mal d'applications console écrites en Qt plutôt qu'en C ++ standard en raison de la facilité avec laquelle elles peuvent être écrites.

Je dirais que la productivité de Qt est supérieure à celle de C / C ++ mais inférieure à celle de langages comme Python.

WKS
la source
2
Je suppose que tout est relatif à l'expérience de l'individu, car je peux coder correctement en C ++ 14, mais chaque fois que je jette un coup d'œil à un code Qt, je dois plisser les yeux pour le reconnaître comme le même langage ... Je ne pense pas que ce soit l’augmentation unanime de la productivité que vous sous-entendez ici.
underscore_d
1
@underscore_d évidemment, si vous connaissez très bien le C ++ et que vous ne le savez pas, vous ne serez pas plus productif avec ce dernier. Mais lorsque vous connaissez à la fois C ++ et Qt, le framework facilite beaucoup et beaucoup la mise en oeuvre de nombreuses choses (C ++ 11, 14, etc., comblent les lacunes, mais pas encore complètement).
Ymoreau
11

Ce n’est pas vraiment une tentative de déclencher une guerre des flammes, je voulais juste aborder quelques points.

Probablement la vraie raison pour laquelle Qt n'est pas plus largement utilisé est qu'il est C ++ et que moins de gens l'utilisent pour les applications de bureau.

Qt n'est pas une bibliothèque C ++. Cela nécessite une étape de compilation séparée, ce qui rend le processus de construction beaucoup plus compliqué par rapport à la plupart des autres bibliothèques.

Le vs-addin pour Visual Studio le fait automatiquement, comme le fait le processus de création de ligne de commande de Qt. Le compilateur de ressources utilisé pour créer les boîtes de dialogue pour MFC constitue également une étape distincte, mais cela reste du c ++.

Qt est une grande quantité de source, qui doit être présente et préinstallée sur toute machine utilisée avant la compilation. Cela peut rendre la création d'un environnement de construction beaucoup plus fastidieuse.

Il existe un téléchargement binaire pour chaque version de visual studio et la création à partir de la source est une commande unique. Je ne vois pas la taille de la source SDK est tellement un problème ces jours-ci. Visual studio installe désormais toutes les bibliothèques C ++ au lieu de vous laisser choisir, de sorte que la taille d'installation du compilateur est> 1 Go.

Il est disponible uniquement sous LGPL, ce qui rend difficile l'utilisation d'un déploiement à un seul binaire lorsqu'il est nécessaire de publier sous une licence plus restrictive ou moins restrictive.

La LGPL ne s'applique qu'à la bibliothèque, cela n'affecte pas votre code. Oui, cela signifie que vous devez envoyer des DLL plutôt qu'un seul fichier binaire (sauf si vous payez), mais dans un monde où vous devez télécharger un runtime Java ou une mise à jour .Net pour un utilitaire minuscule, ce n'est pas si grave. C'est également moins un problème sur les plates-formes avec une seule ABI, de sorte que d'autres applications Qt peuvent partager les bibliothèques.

Dans certains cas, les programmes natifs ne ressemblent pas. Concevoir une interface utilisateur unique pour toutes les plates-formes ne va pas forcément bien paraître lorsqu'il est déplacé de machine en machine, pour diverses raisons de style visuel.

Il est supposé utiliser des widgets et des thèmes natifs. Je dois admettre que je fais surtout des applications techniques pour que mes utilisateurs ne soient pas trop préoccupés par le style. Sur Windows, en particulier, la nouvelle mode consistant à tout transformer en un widget pour smartphone signifie qu’il existe de moins en moins de standard.

Martin Beckett
la source
1
Beaucoup de grands éditeurs de logiciels construisent des applications commerciales en C ++, mais je ne connais pas beaucoup d’entre eux qui utilisent QT. Ainsi, même si je comprends que les développeurs non-C ++ pourraient éviter QT, il y a d'autres raisons pour éviter QT même lorsque vous écrivez une application C ++, semble-t-il. En fait, il n'y a pas vraiment de langage multi-plateformes et de boîte à outils graphiques avec lesquels je ne trouve rien à redire. Il semble que le développement multiplateforme soit JUST PLAIN HARD, et que le faire correctement n’est jamais facile ni gratuit, et que la promesse faite par QT (écrire votre interface graphique une fois et réutiliser celle-ci partout) ne suffit pas.
Warren P
La plupart des logiciels de bureau C ++ se trouvent dans MFC, car ils ont démarré il y a 20 ans ou utilisent une boîte à outils interne créée il y a 20 ans pour éviter MFC (par exemple, MS-Office ou Autocad). Je doute beaucoup que ce soit écrit en C ++ / CLR avec WPF. Mais même sans considérations multiplateformes, je trouve Qt le meilleur (ou le moins pire!) Des outils de bureau. Comme la plupart des gens, nous nous dirigeons vers une interface Web (éventuellement dans QtQuick / QML) et un serveur C ++ - qui utilisera probablement des signaux / slots Qt mais pas de gui
Martin Beckett
Je suis d'accord. Le moins pire. Et même sur les applications Windows uniquement, je préfère déboguer les problèmes QT que les problèmes MFC.
Warren P
@WarrenP - oui, je ne manque pas de chercher codeproject pour tout ce qui manque au MFC. Mais avec le nouvel amour de MSFT pour le code natif, ils n'ont pas fait grand chose pour faciliter l'écriture d'un gui.
Martin Beckett
7

La raison est simple: il n’a pas de bonnes liaisons avec toutes les langues courantes, et comme par magie, il n’est pas toujours approprié au travail à effectuer.

Utilisez le bon outil pour le travail. Si j'écris une simple application en ligne de commande, pourquoi devrais-je la gonfler avec Qt juste pour le plaisir de l'utiliser?

Comme réponse plus générale (que je peux donner parce que je suis pertinent ici), certains programmeurs n’auront tout simplement jamais essayé et décidé de l’utiliser. Dans certains cas, il n'y a pas de raison particulière autre que le programmeur n'a jamais trouvé le besoin et a examiné.

Courses de légèreté en orbite
la source
1
Mais Qt offre la possibilité d'écrire uniquement une application console. N'est-ce pas?
Déshumaniseur
9
@ Dehumanizer: Je n'en ai aucune idée. Mais pourquoi devrais-je l'utiliser pour un petit outil utilitaire? Quel avantage cela apporterait-il lorsque je peux écrire trivialement l'application uniquement en C ++ standard? On dirait que vous cherchez une raison d'utiliser une bibliothèque , ce qui est un moyen arriéré de programmer.
Courses de légèreté en orbite le
12
@Dehumanizer: Comme je l'ai dit, c'est une approche rétrograde. Lorsque vous aurez besoin d'une bibliothèque, vous saurez que vous pourrez ensuite en essayer quelques-unes et voir ce qui vous convient le mieux. Essayer de recueillir des opinions sur une bibliothèque alors que vous n'avez pas de cas d'utilisation est une course dupe.
Courses de légèreté en orbite le
3
"Si j'écris une simple application en ligne de commande, pourquoi devrais-je la gonfler avec Qt juste pour le plaisir de le faire", il existe au moins un très célèbre outil non-gui écrit en Qt - Doxygen :-)
Valentin Heinitz
4
@Dehumanizer par exemple lorsque vous devez traiter des fichiers, xml, unicode, json, regexp, concurency, bases de données, etc., très rapidement et que vous ne voulez pas télécharger, adopter, maintenir des dizaines de bibliothèques tierces.
Valentin Heinitz
5

Cadres comme Qt sont appropriés lorsque vous êtes plus préoccupé par votre produit à la recherche de la même sur toutes les plateformes que votre produit à la recherche à droite sur toutes les plateformes. De plus en plus, de nos jours, ce type d’applications passe aux technologies Web.

Caleb
la source
4

Je conviens que Qt est un cadre agréable pour travailler. Néanmoins, il y a un certain nombre de problèmes que j'ai avec elle:

  1. Il est écrit en C ++, qui est un langage de très bas niveau. Le seul fait qu’il s’agisse de C ++ rendra chaque programmeur Qt beaucoup moins productif que les cadres écrits dans d’autres langues. Mon principal atout avec C ++ en tant que langage de développement graphique est qu’il n’a pratiquement aucune notion de gestion automatique de la mémoire, ce qui rend le processus de développement beaucoup plus sujet aux erreurs. Ce n'est pas introspectif, ce qui rend le débogage beaucoup plus difficile. La plupart des autres principaux kits d’interface graphique ont des notions de gestion automatique de la mémoire et d’introspection.
  2. Chaque boîte à outils multiplate-forme présente le problème suivant: elle ne peut implémenter que le plus petit dénominateur commun de toutes les plates-formes prises en charge. Cela, ainsi que différentes directives d’interface utilisateur sur différentes plates-formes, remet beaucoup en question l’intérêt des interfaces graphiques multi-plateformes dans leur ensemble.
  3. Qt est très centré sur le codage de toute votre interface utilisateur. Même si vous pouvez utiliser QtDesigner pour construire certaines parties de votre interface utilisateur, il manque sérieusement par rapport au constructeur d'interface (Cocoa / Obj-C) ou aux outils .Net.
  4. Même si Qt inclut beaucoup de fonctionnalités d’application de bas niveau, il n’est pas comparable à un cadre personnalisé pour une plate-forme donnée. Les bibliothèques de système d'exploitation natives pour Windows et OSX sont nettement plus puissantes que les implémentations de Qt. (Pensez aux frameworks audio, à l’accès au système de fichiers de bas niveau, etc.)

Cela dit, j'adore utiliser PyQt pour le prototypage rapide d'applications ou les applications internes. L'utilisation de Python pour effectuer tout le codage atténue les inquiétudes liées au C ++ et fait de Qt un endroit très agréable.


Modifier, en réponse à certains commentaires:

Quand j'ai écrit à propos de Qt écrit en C ++, je ne me plaignais pas tellement de Qt lui-même, mais plutôt de l'environnement dans lequel il évolue. Il est vrai que Qt gère très bien ses propres ressources, mais toutes vos interfaces graphiques (GUI), mais Le code non-Qt doit également être écrit en C ++. Même là, Qt fournit de nombreux outils intéressants, mais au final, vous devez traiter avec C ++ à ce niveau. Qt rend le C ++ supportable, mais reste le C ++.

En ce qui concerne l’introspection, je veux dire ceci: Les cas les plus difficiles à résoudre sont ceux qui ont un pointeur sur un objet qui ne se comporte pas comme il le devrait. Avec C ++, votre débogueur pourra peut-être regarder un peu à l'intérieur de cet objet (s'il a des informations de type à un moment donné), mais même cela ne fonctionne pas toujours. Prenez, par contre, le cacao dans la même situation. Dans Cocoa / Obj-C, vous pourrez envoyer des messages ("fonctions d'appel") à un objet directement dans le débogueur. Vous pouvez changer l'état des objets, vous pouvez l'interroger pour ses attributs, vous pouvez lui demander son type et ses noms de fonctions ... Cela peut rendre le débogage beaucoup plus pratique. Qt / C ++ n'a rien de semblable à cela.

bastibe
la source
11
1. Qt s'occupe seul de la gestion de la mémoire, vous ne devez pas appeler «supprimer» après chaque «nouveau». 1a. C ++ n'est PAS un langage de bas niveau, c'est un langage de haut niveau avec des 'capacités' de bas niveau. 3. Je suis d'accord, mais Qt prévoit de créer une interface utilisateur avec QtDesigner et avec du «code simple» en même temps. 4. Acceptez à nouveau, mais Qt fournit également l’utilisation d’API natives.
Déshumaniseur
11
Je pense que c ++ a une sorte de gestion de la mémoire semi-automatique: si vous utilisez des pointeurs intelligents comme std :: auto_ptr ou boost :: shared_ptr, etc., vous n'avez généralement pas à vous soucier de libérer de la mémoire. Ce type de conteneurs peut également être créé pour d'autres ressources (fichiers, ressources système à libérer). L'utilisation de RAII-pattern aide beaucoup à la gestion de la mémoire et, au fur et à mesure de son développement, vous n'avez pas à vous soucier de la mémoire.
deo
8
"Le fait qu’il s’agisse de C ++ seul réduira considérablement la productivité de chaque programmeur Qt par rapport aux cadres écrits dans d’autres langues." [citation nécessaire]
Nathan Osman
4
@ SK-logic: Bien que je pense avoir compris tous les mots de votre troisième phrase, je n'ai aucune idée de ce que vous dites. Qu'est-ce qu'un "niveau d'abstraction"? D'ailleurs, votre première phrase est fausse, étant donné la définition de «langage de bas niveau» dans Wikipedia.
David Thornley
6
@ SK-logic: La métaprogrammation des modèles est Turing-complete, et certaines personnes sont suffisamment intelligentes et bien informées pour en tirer parti. RAII n’est pas un excellent ramasse-miettes, mais le fait qu’il fonctionne pour toutes sortes de ressources compense plus ou moins cela. Maintenant, spécifiquement, quelle sorte d'abstraction fonctionne en Java mais pas en C ++?
David Thornley
3

J'aime beaucoup Qt, mais c'est un peu lourd pour beaucoup d'applications. Parfois, vous n'avez simplement pas besoin de ce niveau de complexité. Parfois, vous avez juste besoin de quelque chose de simple sans tous les frais généraux de Qt. Toutes les applications ne doivent pas nécessairement être pilotées par les événements et C ++ fournit un ensemble raisonnable de modèles. Boost fournit un autre très bon ensemble et inclut beaucoup de fonctionnalités de bas niveau (fichier, socket, pointeurs gérés, etc.) que QT.

D'autres applications ont des exigences de licence qui ne fonctionnent pas bien avec les licences commerciales de GPL, LGPL ou Qt. La GPL est inappropriée pour les logiciels commerciaux. La LGPL est inappropriée pour les logiciels liés statiquement et la licence commerciale coûte de l'argent - ce que beaucoup ne veulent pas payer.

Certains ont des considérations de sécurité ou de stabilité qui n'autorisent pas les bibliothèques complexes comme Qt.

Vous devez exécuter moc pour pré-traiter vos sources. Ce n'est pas un gros problème, mais cela peut être décourageant pour le nouvel utilisateur. Beaucoup de programmeurs pensent que vous avez besoin d'utiliser Qmake avec Qt, mais c'est un terme impropre. Il est possible de connecter Qt à d’autres systèmes de compilation assez facilement.

Certaines cibles sont très limitées en mémoire ou en CPU.

Il y a des pièges spécifiques à la plate-forme. La plupart de ces pièges sont sans papiers. Construisez une application suffisamment volumineuse et vous allez vous y poser des questions et vous demander ce qui se passe (disclaimer, la dernière fois que j'ai utilisé Qt dans la colère datait de plus de 18 mois, alors elle s'est peut-être améliorée).

C'est seulement C ++. D'autres liaisons de langage existent, mais elles ont tendance à masquer ou à exposer mal une grande partie des fonctionnalités pour lesquelles vous souhaiteriez utiliser Qt.

Il y a beaucoup de raisons de ne pas utiliser Qt, c'est pourquoi il existe des alternatives. Si tout ce que vous avez est un marteau, alors chaque problème ressemblera à un clou.

Adam Hawes
la source
3

La chose la plus importante mais non mentionnée. Dans les gros projets, une chose cause tellement de problèmes et de code non nécessaire. Les mécanismes d'intervalle de signal de Qt sont inefficaces. Les widgets Qt ne fournissent pas les signaux nécessaires pour les widgets simples d'événements. Par exemple, vous ne pouvez pas définir de signaux pour onHover, onMouseEnter, onMouseLeave, onKeyReleased, onLostFocus, onGainFocus, etc. Même le widget le plus complexe, tel que QTreeWidget, fournit un ou deux signaux extrêmement simples et inutiles.

Oui, vous pouvez utiliser les événements MAIS !!! vous avez créé une nouvelle classe pour chaque widget avec un événement personnalisé. C'est une énorme efficacité perdue;

  • Vous avez réécrit chaque événement d'objet de widget personnalisé avec de petites modifications.
  • Vous perdez tous les éléments de Qt Designer. Vous devez promouvoir chaque widget avec des événements personnalisés.
  • Le projet est devenu plus gros et difficile à maintenir.
  • Vous avez commencé à ne pas aimer qt pour cette raison. Et commencez à parler de la façon dont .net fournit aux délégués, combien il est bien meilleur que l’emplacement du signal, comment les composants .net (widgets) fournissent généralement tous les événements imaginables. Et etc.

Un de mes collègues a créé une nouvelle classe de boîtes à options pour chaque widget Boîte à options, car il devait utiliser un événement non signal. Histoire vraie...

Cependant, Qt est à ce jour le meilleur framework d’interface utilisateur C ++ avec des hauts et des bas.

Obrix
la source
Concernant les événements et la création de nouvelles classes: vous pouvez utiliser des filtres d’événement dans les classes qui doivent y réagir.
MrFox
"Oui, vous pouvez utiliser les événements MAIS !!! vous avez créé une nouvelle classe pour chaque widget avec un événement personnalisé. C'est une énorme perte d'efficacité;" - PAS EXACTEMENT. Je viens de me retrouver avec bool eventFilter qui gère plusieurs widgets, puis installEventFilter (this) sur tous les widgets enfants. Et cela ne perd pas en efficacité et en performance de programmation! En fait, je n'utilise jamais de "widgets sponsorisés" ... Je supprime simplement un widget vide, l'installe en tant qu'événementFilter et réimplémente la plupart de mes événements dans ma classe principale cpp. Essayez, vous n’avez pas mal :) Vous pouvez personnaliser presque TOUT en Qt sans créer de nouvelles classes à chaque fois
Modifiez-vous!
3

Selon moi, apprendre la programmation C ++ est plus simple que de tomber dans d'autres langages qui cachent leur complexité, et le programmeur ne sait pas ce qui se passe réellement en arrière-plan. Qt, d’autre part, ajoute des avantages par rapport au C ++, pour le rendre plus avancé que le C ++ natif. Ainsi, Qt C ++ est un excellent cadre pour qui veut développer des tâches de bas niveau, ou de haut niveau, de la même manière. C ++ est (selon certaines pratiques) un langage simple et complexe. Complexe pour qui ne veut pas contester, simple pour celui qui aime. Ne le laissez pas pour sa complexité!

utilisateur100691
la source
2

La raison réelle n'est pas technique.

Les gens sont différents. Tels sont leurs choix. L'uniformité n'est pas une caractéristique humaine.

mouviciel
la source
Est-ce pourquoi tout le monde marche sur ses jambes? Bien, ceux qui ont des jambes au moins ...
dtech