Comment écrire une interface graphique pour un grand projet c++ multiplateformes?
j'ai un grand projet multiplateforme (Linux et Windows) C++, pour lequel je veux créer une interface graphique.
j'ai quelques questions très générales sur les principes de base de l'interface graphique pour projet de ce type:
- L'interface graphique doit-elle être séparée de la logique de l'application?
- Si elle est séparée, comment la logique et l'interface graphique de communiquer? Les sockets TCP/IP sont-ils une bonne option? Quelles sont les autres possibilités?
- Est-ce une bonne idée d'avoir L'interface graphique un langage différent d'un c++? Si oui, quelle langue?
- Est-ce une bonne idée d'avoir une interface graphique basée sur un navigateur?
- même si la logique de base du projet est multiplateformes, je peux décider que L'interface graphique ne sera basée que sur Windows (.NET?) et il communiquera avec la logique sur la machine Win/Linux pertinente à travers Socket ou une méthode similaire. Est-ce une bonne idée de le faire?
11 réponses
L'interface graphique doit-elle être séparée de la logique de l'application?
Oui, certainement....
Si elle est séparée, comment la logique et l'interface graphique de communiquer? Les sockets TCP/IP sont-ils une bonne option? Quelles sont les autres possibilités?
...mais pas beaucoup. Les prises seraient excessives (exception: voir question 5). D'habitude, vous divisez les classes en parties GUI et backend. Les classes GUI appellent alors les méthodes de la backends.
est-ce une bonne idée d'avoir L'interface graphique dans un langage différent du c++? Si oui, quelle langue?
si c'est le cas, vous devrez intégrer les deux langues, donc je recommande d'écrire tout dans la même langue. Mais pour répondre à votre question, vous pouvez par exemple créer des liaisons Python pour votre backend et écrire L'interface graphique en Python (avec PyGTK, PyQT ou wxWidgets).
est-ce une bonne idée d'avoir un navigateur basé GUI?
cela dépend de la façon dont vous voulez déployer votre application. Si elle doit être installée sur chaque ordinateur client, une interface web n'a pas de sens. Si vous voulez l'héberger de manière centralisée, vous pouvez opter pour une interface web.
même si la logique de base du projet est multiplateformes, je peux décider que L'interface graphique ne sera basée que sur Windows (.NET?) et il communiquera avec la logique sur la machine Win/Linux pertinente à travers Socket ou une méthode similaire. Être une bonne idée de le faire?
je pense que cela fait sens seulement si l'arrière-plan doit être sûr (c.-à-d. ne pas être installé sur les ordinateurs des utilisateurs) ou si vous avez une approche client mince comme à la question 4. Écrire des graphiques multiplateformes est beaucoup plus facile que d'écrire des backends multiplateformes (à mon avis), donc vous devriez plutôt faire les deux parties multiplateformes. En passant, les interfaces graphiques basées sur .NET ne sont pas Windows-seulement - Mono supporte déjà un grand sous-ensemble de formes Windows, par exemple (mais pas WPF, malheureusement).
EDIT:
Le Mono De La Migration De L'Analyseur (MoMA) pour savoir si quelque chose ne fonctionne pas en Mono. Mais je pense que le fait que de nombreuses entreprises utilisent avec succès Mono dans des environnements de production signifie que vous devriez au moins considérer Mono comme un option!L'interface graphique doit-elle être séparée de la logique de l'application?
il devrait, parce que les widgets UI sont juste des types d'objets et une des règles de OO dit que chaque l'objet doit être de confiance avec les responsabilités qu'il peut remplir. Un dialogue ne sait pas grand chose sur la sérialisation par exemple.
Si elle est séparée, comment la logique et l'interface graphique de communiquer? Être Les sockets TCP / IP sont une bonne option? Quels sont autre possibilités?
Cela dépend de combien de séparation dont vous avez besoin. J'utilise des messages asynchrones pour la communication, et puis je peux utiliser différentes couches de transport, sans beaucoup de changements. TCP / IP vous permettrait d'utiliser L'interface graphique sur une machine séparée du noyau, mais il a une charge plus élevée que passer des messages de fenêtre par exemple.
Est-ce une bonne idée d'avoir l'interface graphique dans un un langage différent d'un c++? Si oui - qui de la langue?
Idéalement, vous devriez utiliser le moins de langues possible à moins que vous ayez vraiment besoin des capacités techniques d'un certaines langues. Les interfaces graphiques sont plus d'une bibliothèque de problème qu'un problème de langue, donc si vous pouvez trouver un très bon C++ UI library (indice: Qt), vous devez coder tout votre programme en C++.
Est-ce une bonne idée d'avoir une GUI basé sur le navigateur?
c'est possible, mais vous devriez penser aux exigences et non aux idées. Vos clients souhaitent interagir avec votre programme à partir d'un navigateur? Peuvent-ils se permettre les coûts supplémentaires et le temps de développement? Avez-vous de savoir comment faire?
même si la logique de base du projet est multi-plateforme, je peux décider que L'interface graphique ne sera basée que sur Windows (.NET?) et il communiquera avec la logique de Win / Linux machine à emboîter ou similaire méthode. Est-ce une bonne idée de le faire?
Il pourrait être une bonne idée, mais voyez la réponse au n ° 3. Considèrent également que vous allez travailler sur un programme client-serveur, ce qui est nettement plus compliqué qu'un programme autonome. Enfin, vous devez examiner les avantages et les inconvénients d'une dépendance à .NET par rapport à l'utilisation d'une bibliothèque D'UI C++: qu'est-ce que .NET vous apporte que vous ne pouviez pas obtenir avec wxWdigets, Qt, gtkmm, etc.
(1) Habituellement, Oui, cela permet de maintenir la logique opérationnelle et l'interface utilisateur séparément. Il vous permet également d'avoir plus tard, par exemple à la fois un navigateur basé Saas interface utilisateur ainsi que d'un bureau style mode d'exploitation sans réseau local et encore partager l'ensemble du code logique de l'application.
(2) Ne pas utiliser les sockets TCP/IP. En général, l'application et l'interface graphique communiqueraient en utilisant la transmission d'événements et/ou de messages. Par exemple, lorsque l'application veut informer le GUI que quelque chose arrive, il crée un événement synthétique qui est ensuite poussé à la file d'attente d'événements de l'interface graphique. Si l'application est basée sur des événements aussi, L'interface graphique peut communiquer avec elle en postant des événements. Pour les opérations non bloquantes et rapides, L'interface graphique peut appeler directement le code logique de l'application, mais l'appel doit alors être garanti pour revenir rapidement. Pour les opérations plus lentes, vous avez de toute façon besoin d'un thread séparé pour les traiter. Ce thread peut être celui qui traite les événements côté application, ou vous peut le générer comme un thread worker si nécessaire.
le produit de notre société a une interface utilisateur au-dessus de L'IDE Eclipse, mais une partie de la logique de l'application est écrite en C++. Les deux parties communiquent sur CORBA, c'est-à-dire essentiellement asynchrone mécanisme d'événement. Nous avons été satisfaits de cette solution.
sur une plus petite échelle, les applications GUI séparent généralement L'UI et la logique d'application en utilisant des abstractions telles que Model-View-Controller (MVC).
(3) C'est toujours une corvée pour intégrer les composants écrits en deux composants différents. Je pense que vous ne devriez à cela que si vous avez un avantage évident de plate-forme. Par exemple: nous bénéficions des composants de L'IDE Eclipse, tandis que L'application bénéficie de la vitesse brute de C++.
(4) les interfaces graphiques basées sur le navigateur sont excellentes, mais l'intégration avec la logique d'affaires souffre de latence et le mode apatride des serveurs Web rend l'architecture lourde si vous avez réellement une application de type bureau. Basée sur un navigateur GUI est bon pour les applications logicielles en tant que service parce qu'elles ne nécessitent pas d'installation par l'utilisateur et peuvent être mises à niveau par le développeur de produits à volonté, mais si vous ne prévoyez pas d'offrir votre produit en tant que Logiciel en tant que service (comme Salesforce).
(5) Si votre logique d'application est multiplateformes, j'essaierai de faire en sorte que L'interface utilisateur soit multiplateformes. Sinon, pour les plates-formes où vous ne supportez la logique de l'application que vous pourriez avoir besoin d'installer deux systèmes, un pour exécuter L'interface utilisateur et un pour exécuter la logique d'application. Il existe de bons cadres d'interface utilisateur multiplateformes, au moins
- AJAX / navigateur de base de l'INTERFACE utilisateur
- Trolltech / Nokia Qt
- Eclipse (SWT)
- Java Swing (hmm...)
il est préférable d'utiliser python comme langage gui de base avec QT comme plate-forme gui. si vous divisez l'interface graphique et le programme de base en deux processus distincts, vous pouvez utiliser ces mécanismes pour la communication:
- signaux et slots de Qt
- sous-processus module python
- prises locales.
- utiliser des fichiers [écrire des configs de fichier de signal et d'autres processus pour actualiser]
mais il est préférable de créer un processus et appelez votre base langage directement à partir de python et communiquer avec les structures de données de langue maternelle. utilisez swig dans ce but. mais comme vous ne pouvez pas appeler les fonctions python depuis C++, vous pouvez utiliser pooling chez python pour quelques changements dans les données partagées et faire quelque chose basé sur ces changements. j'ai vécu les deux sens. quand j'ai utilisé python pour L'interface graphique et la gestion, cela peut être très économe en temps.
1. L'interface graphique devrait-elle être séparée de la logique de l'application?
Oui. Toutefois, voir la réponse #2
2. Si elle est séparée, comment la logique et l'interface graphique de communiquer? Les sockets TCP/IP sont-ils une bonne option? Quelles sont les autres possibilités?
je crois que c'est une meilleure façon de répondre en choisissant une GUI cadre, MFC, .NET, wxWidgets, Qt, .... Le cadre que vous choisissez s'occupera à la fois de la séparation et de la communication pour vous, en tant que le plus délicatement possible.
n'essayez pas de réinventer la roue. Les concepteurs du cadre ont mis beaucoup plus de réflexion et d'essais dans leurs implémentations que vous ne pourriez jamais vous permettre de faire.
notez que la question #1 suggère que vous demandez de séparer la logique dans une seule application. Cependant, des questions plus tard suggèrent que vous pourriez penser à deux applications séparées, peut-être même en cours d'exécution sur des machines séparées.
je considère que le fait d'avoir la GUI dans une application complètement séparée aboutira toujours à quelque chose qui sera lent et inflexible. Cependant, si vous ne vous souciez pas de la vitesse et de la flexibilité, et en particulier si vous avez déjà l'application core fonctionnant avec une interface de type console simple, alors ce pourrait être la meilleure façon de procéder.
3. Est-ce une bonne idée d'avoir L'interface graphique dans un langage différent du c++? Si oui, quelle langue?
Non.
Si vous êtes un une seule personne de l'équipe de programmation, alors vous serez propagation vous-même trop mince en essayant de maîtriser deux langues. Si vous êtes une équipe multi-personnes, pourquoi compliquer les problèmes de communication en mettant en place deux cultures différentes?
4. Est-ce une bonne idée d'avoir une interface graphique basée sur un navigateur?
Pas si vous pouvez l'éviter. Si vous avez besoin d'une interface graphique basée sur le navigateur, alors vous le saurez. Si vous n'en avez pas besoin, puis garder les choses simples et de l'ignorer.
5. Quoique la logique de base du projet est multiplateformes, je peux décider que L'interface graphique ne sera basée que sur Windows (.NET?) et il communiquera avec la logique sur la machine Win/Linux pertinente à travers Socket ou une méthode similaire. Est-ce une bonne idée de le faire?
Même réponse que #4
Certains utilisateurs ont déjà donné des réponses à vos questions c'est pourquoi je veux vous donner quelques conseils comment je gère mes projets.
Q: sur quel OS mon application doit-elle s'exécuter?
Windows et Linux! -> Je voudrais utiliser du C++ ou du Java
Q: la vitesse d'exécution est-elle importante?
Oui! (calculs, graphiques, accès aux ressources du système...) - >En vue de la vitesse C++ est souvent plus rapide (pas toujours)
Q: un fichier de configuration est-il nécessaire?
A: Yes! Je dois définir des valeurs spécifiques à l'utilisateur et au système. - >Pourrait sauvegarder config dans le registre mais puisque nous voulons aussi utiliser notre application sur linux utilisons xml (rapidxml serait une bonne solution pour C++)
Q: une base de données est-elle nécessaire?
A: Oui, j'ai quelques informations/les calculs que j'ai besoin d'enregistrer (local/global). - >Local: j'utiliserais sqlite - > Si vous avez juste à sauver comparativement peu information veuillez envisager un moyen plus rapide de stocker ces renseignements (xml?!)
Q: Comment dois-je structurer mon application?
A: toujours séparer votre interface graphique de la partie "logique" - > facilite la modification du code plus tard et vous pourrez utiliser votre code pour d'autres projets également. + les raisons déjà mentionnées.
Q: Comment dois-je structurer mon interface graphique?
A: pensez à ce que votre application devrait être utilisé et ce que les utilisateurs devraient être en mesure de faire. Ah, et s'il vous plaît ne créez pas une hiérarchie trop profonde qui signifie que l'utilisateur ne devrait pas avoir à ouvrir 10 fenêtres afin d'ouvrir la fenêtre qu'ils veulent avoir. En va de même pour votre code, ce n'est pas une sage décision d'avoir trop d'objets pour créer un nouvel objet.
object->object->object->object->object->object->object->object
Q: Est-ce que mon application doit communiquer avec une application serveur?
A: Oui? Vous devrez utiliser des douilles! Mais gardez à l'esprit que les communications via les sockets ne sont pas très rapides et sécurisés, donc ne les utilisez pas si vous n'avez pas à le faire.
Q: Je ne sais pas comment démarrer (nous sommes un groupe de développeurs)
A: Quand je commence un nouveau projet je pense à tous ces points (peut-être plus) + pour voir quelles classes et méthodes j'ai besoin, je commence par créer un diagramme UML qui m'aidera à comprendre où je devrais commencer et le diagramme m'aidera aussi à garder une trace de mon les classes et les méthodes et la façon dont elles sont impliquées les unes avec les autres. Le diagramme UML aidera également vos collègues ou clients à comprendre comment votre application sera structurée.
pour les projets plus importants, j'utiliserais C++ & wxWidgits ou peut-être Qt. (Juste mon point de vue)
Rgds Layne
si vous voulez un bon exemple de solution GUI multi-plateforme libre et bien écrite, puis-je vous suggérer de regarder wxWidgets (1