QT-C ++ vs Generic C ++ et STL [fermé]

19

J'ai récemment révisé mon C ++, sur Ubuntu QQ. J'adore le cadre Qt pour tout, en particulier la création d'interfaces graphiques. Je me suis familiarisé avec lui lors de l'utilisation de PyQt au cours des dernières années.

Lors de l'utilisation de PyQt, j'ai eu quelques problèmes qui sont maintenant plus prononcés lors de l'utilisation de C ++ avec Qt: Qt a de nombreuses extensions à C ++ qui sont spécifiques à Qt - QString n'est qu'un exemple courant, sans parler de la collecte automatisée des ordures. Il est possible d'écrire des applications Qt en C ++ sans en savoir grand-chose sur C ++ et la STL.

Je devrais peut-être bientôt revenir sur le marché du travail et j'aimerais pouvoir envisager des postes en C ++ - mais je crains de trop me lier à Qt limitera mes capacités à travailler avec du C ++ générique, qui était autrefois assez formidable mais sont maintenant longtemps dormants et rouillés.

Dois-je éviter Qt? Serais-je mieux d'utiliser WxWidgets ou GTK ++ pour créer des interfaces graphiques?

Quel est le meilleur framework GUI à utiliser qui permet / nécessite la plus grande utilisation du C ++ générique et de la STL? Comment puis-je me rendre le plus commercialisable en tant que programmeur C ++ en ce qui concerne les frameworks GUI, etc.?

Vecteur
la source

Réponses:

15

Je ne m'abstiendrais pas d'utiliser Qt juste pour ces raisons. Vous n'êtes pas obligé d'utiliser toutes les classes d'utilitaires de Qt; pour ceux qui remplacent la STL, vous serez tout au plus obligé d'utiliser QString et, éventuellement, QStringList. En outre, un programme comporte généralement bien plus que l'interface graphique. Vous pouvez toujours utiliser exclusivement du C ++ générique pour le reste de votre programme et utiliser Qt uniquement pour l'interface graphique.

À mon avis, travailler avec STL consiste davantage à comprendre quelles structures de données sous-jacentes sont utilisées et leurs complexités, et par conséquent à quel moment vous devez utiliser chaque conteneur. Et en ce qui concerne la programmation C ++, il s'agit surtout de savoir comment utiliser l'en-tête <algorithm> très essentiel, qui devrait également fonctionner sur les conteneurs de Qt, car ils sont compatibles avec STL.

Je ne vois pas beaucoup de mal à utiliser toutes ces extensions fournies par Qt, tant que vous savez (ou du moins avez une idée générale) de la façon dont elles sont implémentées en interne. Assurez-vous que vous savez que des choses comme Q_OBJECT, SIGNAL (), SLOT (), foreach (), ne sont pas magiques, mais des macros qui se développent en instructions C ++ valides. Par exemple, ce n'est pas si compliqué de comprendre comment les classes implicitement partagées et les relations parent-enfant qui donnent à Qt l'impression d'être plus Java sont implémentées. Vous pouvez toujours essayer de recréer certaines fonctionnalités dans un projet distinct juste pour voir si vous pouvez le faire avec du C ++ générique, et ne vous sentez pas mal de les utiliser dans Qt.

Jetez également un œil aux bibliothèques Boost. Ils fournissent des utilitaires supplémentaires que la bibliothèque C ++ standard ne fournit pas et sont un très bon moyen de se rapprocher un peu du C ++ générique, car ils suivent essentiellement les mêmes conventions que le C ++ générique. Certaines bibliothèques ont des classes modèles assez complexes, et essayer simplement de comprendre comment elles fonctionnent est, en soi, une bonne étude en C ++. Boost possède de nombreux utilitaires introuvables dans Qt, et d'autres qui implémentent des concepts identiques ou similaires à certaines classes de Qt et peuvent être utilisés à leur place.

Si vous entrez sur le marché du travail en travaillant avec C ++, il est probable que vous allez travailler avec Qt ou un autre framework qui, comme lui, aura ses propres classes d'utilitaires qui essaient de simplifier C ++.

LLLL
la source
4
+1 pour "Vous pouvez toujours utiliser exclusivement du C ++ générique pour le reste de votre programme et utiliser Qt uniquement pour l'interface graphique."
Md Mahbubur Rahman
@MahbuburRAaman - oui - c'est un excellent conseil. Utilisez Qt uniquement pour l'interface graphique et ce qui est nécessaire pour se connecter à l'arrière. Écrivez le reste en utilisant Generic C ++, STL, Boost - les outils qui sont utilisés universellement.
Vecteur
5

Je suis d'accord avec la plupart des éloges de Qt, mais la question était quel est le meilleur cadre GUI à utiliser qui permet / nécessite le plus d'utilisation du C ++ générique et de la STL? À cet égard, Qt est un peu schizophrène: il duplique les conteneurs STL et les algorithmes avec ses propres rebondissements. Il fournit également des conteneurs différents de STL. L'interopérabilité entre Qt et STL n'est pas toujours fluide. Dans certains cas , il faut quelques appels de fonction pour obtenir de std::stringla QStringet le dos.

wxWidgets a une option pour la construction STL, qui utilise exclusivement des conteneurs STL - il n'y a pas d'univers parallèle avec des remplacements maison comme dans le cas de Qt. Il compile également avec un compilateur C ++ standard sans avoir besoin d'extensions non standard. C'est un cadre GUI de qualité qui mérite d'être considéré.

Vous pouvez également consulter un gtkmm, qui est un wrapper C ++ autour de GTK +. C'est plus proche de satisfaire votre première exigence que Qt.

Paul Jurczak
la source
1
'wxWidgets a une option pour la construction STL, qui utilise exclusivement des conteneurs STL ...' - Je vois - c'est IMPORTANT à savoir. 'Dans certains cas, il faut quelques appels de fonction pour passer de std :: string à QString' - compris - je ne l'ai pas encore étudié. Je suis un peu familier avec GTK et Wx - mais Qt semble briller en comparaison, au moins de mon point de vue - C ++ n'est PAS ma première langue - je suis venu du monde Clipper / Delphi puis j'ai appris C ++ parce que je devais faire face à Win 32s etc.
Vector
2

Je ne m'inquiéterais pas trop de ne pas utiliser de bibliothèques STL spécifiques comme std :: string ou std :: iostream ou std :: vector. Les équivalents QT viennent dans une saveur différente mais ils ne sont pas si loin pour poser problème.

La différence la plus idiomatique à mon avis semble être le style de programmation lourd à utiliser newpour l'allocation. Alors que pour un programme QT, cela pourrait être bien pour la partie Gui, la vertu de C ++ et RAII est que vous pouvez réellement garder beaucoup de données sur la pile au lieu du tas. Lorsque vous passez à l'écriture de code non GUI, vous devez vous en souvenir.

wirrbel
la source
1
le point que j'essayais de faire n'est pas que l'allocation de tas est généralement mauvaise, ce n'est tout simplement pas la meilleure chose pour les variables locales. Les classes GUI ont tendance à vivre longtemps et sont mieux réparties sur le tas, les variables locales qui ne sont que temporairement nécessaires vivent bien sur la pile. en C # avec Garbace Collection, ils seront bientôt détruits, donc le tas va aussi. Mais avec les new/deleteappels manuels, ce n'est pas si facile et sujet aux erreurs. Dans les sections critiques (gestion des mégadonnées), cela peut faire la différence, en particulier les deleteappels peuvent être assez lents.
wirrbel
1
ce n'est pas un problème de 10000 objets d'interface utilisateur, mais pour des infrastructures d'arborescence complexes avec un million d'entrées, etc. où une fois pourrait recourir à des moyens plus intelligents d'allocation des choses (allocation en masse ou beaucoup de classes de boost intelligemment écrites, etc.). Conclusion: le tas n'est pas mauvais, il doit être utilisé intelligemment. Parfois, la méthode Qt ne s'adapte pas à d'autres choses. C'est toujours une fabuleuse boîte à outils à mon avis.
wirrbel
Alors qu'en est-il de C ++ 11? des pointeurs intelligents, etc. semblent apaiser bon nombre de vos préoccupations. Je commence juste à jouer avec ça maintenant. Comme je l'ai dit, je suis d'accord que Qt KICKS BUTT. Mon plan est d'utiliser Qt pour l'interface graphique et de faire tout ce que je peux en utilisant C ++ 11 - ce qui semble rendre une grande partie de Boost, par exemple, obsolète et combler dans une large mesure les écarts entre Java / C # et le C ++ old school. J'ai l'impression (à ce stade de loin, certes) qu'une combinaison de Qt et C ++ 11 peut être un grand gagnant.
Vecteur
2
Je pense que vous avez compris mon point de vue: vous avez beaucoup d'options avec C ++, avec c ++ vous devez choisir judicieusement. Les pointeurs intelligents, etc. ont également des problèmes. Marre de C #, vous pourriez jeter un oeil à dlang.org qui fait beaucoup de choses mieux (GCed).
wirrbel
Pendant ce temps, je dois mettre en place une chaîne d'outils qui prend en charge C ++ 11. J'utilise codelite en ce moment - très bon IDE - mais hors de la boîte (compilateur GNU), il ne prend pas en charge 11, comme je viens de le découvrir ... Peut-être que je peut y brancher un compilateur compatible 11. Je ne vais pas commencer par D ou Boo, etc., etc. - comme je l'ai dit en question, je vais peut-être devoir revenir sur le marché du travail assez rapidement et je veux avoir les langues dominantes pour la commercialisation, pas les `` one offs ''. BEAUCOUP d'emplois Python là-bas - dommage que je ne puisse plus supporter Python!
Vecteur