Créer un nouveau logiciel pour AbulÉdu en quelques heures

abuledu-feuille.png

Déjà obsolète !

Il y a moins d'une semaine, j'ai commencé à rédiger ce qui suit, un manuel, un début de support de formation, pour tout nouveau développeur des logiciels du Terrier d'AbulÉdu ... et puis, finalement, au bureau nous avons trouvés un nouveau truc, un truc qui chamboule tout, un truc qui me fais dire que chaque fois qu'on a appris un truc, c'est une base pour la prochaine découverte et ainsi de suite, au fur et à mesure on accumule de l'expérience, et les découvertes sont toujours là pour tout remettre en question d'un coup :)

Donc, lisez ce qui suit ... et ensuite allez voir sur (lien en bas de page)

Attention, créer un logiciel demande du temps !

Le titre peut-être trompeur ... "en quelques heures" je tiens tout de suite à vous mettre les idées au clair, ça ne se fait pas en quelques heures, créer un beau logiciel demande beaucoup de temps.

Mais vous allez voir aussi qu'avec tout ce qu'on a créé depuis 2009 beaucoup de choses sont simplifiées et automatisées !

Note: Les captures d'écran que vous allez trouver dans cet article sont parfois rétrécies, n'hésitez pas à les afficher en grand: un coup de clic droit, voir l'image et hop vous l'aurez en taille 1:1.

Avant tout: installer les outils de développement !

Tout ceci est déjà expliqué ici:

Mon premier logiciel

Comme toujours en programmation, on commence par un "hello world" mais là dans notre cas, je vais faire autre chose, je vous propose de faire un tout petit logiciel de memory avec juste 4 cases (donc deux paires d'images à retrouver).

Création d'un projet dans Qt-Creator

La création du projet est tout à fait classique, la voici en image:

20121125-001-Nouveau.png

20121125-002-Application_graphique_Qt.png

20121125-003-Application_graphique_Qt.png

20121125-004-Application_graphique_Qt.png

20121125-005-Application_graphique_Qt.png

20121125-006-mainwindow.cpp_-_leterrier-memory_-_Qt_Creator.png

On regarde les fichiers produits

L'assistant de création d'une application Qt vous a automatiquement fabriqué quelques fichiers:

leterrier-memory.pro

C'est le fichier de base du projet:

QT       += core gui

TARGET = leterrier-memory
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui
main.cpp

C'est le fichier principal en c++

mainwindow.cpp .h et .ui

C'est votre première fenêtre en Qt, c'est une classe normale :)

Lancement ?

Vous pouvez lancer la compilation et exécuter votre premier logiciel avec la combinaison des touches "Ctrl+R"

Modification pour en faire une AbulEduApplicationV1

Transformer une application Qt en une AbulEduApplicationV1 c'est s'ouvrir la possibilité de bénéficier de tous les modules déjà développés par l'équipe depuis 2009: https://redmine.ryxeo.com/projects/ryxeo/wiki/QT.

Ajouter un fichier version.h

La première étape est d'ajouter un fichier "version.h" à votre projet.

20121125-007-mainwindow.cpp_-_leterrier-memory_-_Qt_Creator.png

20121125-008-Nouveau_Fichier_header_C__.png

20121125-009-Nouveau_Fichier_header_C__.png

Le contenu de ce fichier devra ressembler à ceci: (copiez-collez le code)

#ifndef VERSION_H
#define VERSION_H

#define VER_FILEVERSION             1,0,0,0
#define VER_FILEVERSION_STR         "1.0.0\0"

#define VER_PRODUCTVERSION          1,0,0,0
#define VER_PRODUCTVERSION_STR      "1.0.0\0"

#define VER_COMPANYNAME_STR         "RyXeo SARL"
#define VER_FILEDESCRIPTION_STR     "AbulEdu LeTerrier -- Memory"
#define VER_INTERNALNAME_STR        "leterrier-memory"
#define VER_LEGALCOPYRIGHT_STR      "Copyright (c) 2012 RyXeo SARL"
#define VER_LEGALTRADEMARKS1_STR    "All Rights Reserved"
#define VER_LEGALTRADEMARKS2_STR    "License GNU/GPL v3"
#define VER_ORIGINALFILENAME_STR    "leterrier-memory.exe"
#define VER_PRODUCTNAME_STR         "AbulEdu LeTerrier -- Memory"

#define VER_COMPANYDOMAIN_STR       "abuledu.org"

#endif // VERSION_H

Ajouter la branche externes AbulEduApplicationV1

Ensuite nous allons ajouter les branches externes (bibliothèques de développement créées par l'équipe des développeurs d'AbulÉdu) à l'aide de la commande suivante (application, ouvrir un terminal ligne de commande):

cd /tmp/leterrier-memory/
bzr eadd http://redmine.ryxeo.com/code/leterrier-developpeu/abuleduapplicationv1 lib/abuleduapplicationv1

Voici ce que ça devrait afficher:

erics@erics-x61t /tmp/leterrier-memory ♪ bzr eadd http://redmine.ryxeo.com/code/leterrier-developpeu/abuleduapplicationv1 lib/abuleduapplicationv1
Add external branch http://redmine.ryxeo.com/code/leterrier-developpeu/abuleduapplicationv1 lib/abuleduapplicationv1
Branched 68 revisions.                                                                                                                                                 
adding .bzrignore
adding .bzrmeta
adding .bzrmeta/externals
adding .bzrmeta/externals-snapshot
  Add lib to project lib/abuleduapplicationv1
    Verification des dependances des branches externes ...
      Ajout d'une dependance de branche externe ... abuleduconstantesv1
Add external branch http://redmine.ryxeo.com/code/leterrier-developpeu/abuleduconstantesv1/ lib/abuleduconstantesv1
Branched 22 revisions.                                                                                                                                                 
  Add lib to project lib/abuleduconstantesv1
    Verification des dependances des branches externes ...
      Ajout d'une dependance de branche externe ... abuledunetworkaccessmanagerv1
Add external branch http://redmine.ryxeo.com/code/leterrier-developpeu/abuledunetworkaccessmanagerv1/ lib/abuledunetworkaccessmanagerv1
Branched 98 revisions.                                                                                                                                                 
  Add lib to project lib/abuledunetworkaccessmanagerv1
    Verification des dependances des branches externes ...
      Ajout d'une dependance de branche externe ... abuledumessageboxv1
Add external branch http://redmine.ryxeo.com/code/leterrier-developpeu/abuledumessageboxv1/ lib/abuledumessageboxv1
Branched 24 revisions.                                                                                                                                                 
  Add lib to project lib/abuledumessageboxv1
    Verification des dependances des branches externes ...
      Ajout d'une dependance de branche externe ... abuleduidentitesv1
Add external branch http://redmine.ryxeo.com/code/leterrier-developpeu/abuleduidentitesv1/ lib/abuleduidentitesv1
Branched 45 revisions.                                                                                                                                                 
  Add lib to project lib/abuleduidentitesv1
    Verification des dependances des branches externes ...
      Ajout d'une dependance de branche externe ... abuleduflatboutonv1
Add external branch http://redmine.ryxeo.com/code/leterrier-developpeu/abuleduflatboutonv1/ lib/abuleduflatboutonv1
Branched 28 revisions.                                                                                                                                                 
  Add lib to project lib/abuleduflatboutonv1
    Verification des dependances des branches externes ...
      Ajout d'une dependance de branche externe ... maia
Add external branch http://redmine.ryxeo.com/code/leterrier-developpeu/maia/ lib/maia
Branched 11 revisions.                                                                                                                                                 
  Add lib to project lib/maia
    Verification des dependances des branches externes ...

Ouf ! en effet, si vous regardez la documentation développeur de AbulÉduApplicationV1 vous verrez qu'il y a des "dépendances" vers d'autres libs qui elles même dépendent souvent d'autres libs ... comme il est fastidieux de "suivre le fil des dépendances" nous avons fais le nécessaire dans le plugin bazaar-external pour qu'il fasse tout ça tout seul !

Retour dans Qt Creator

Et là c'est la surprise, si vous ouvrez le fichier leterrier-memory.pro vous allez voir quelques lignes en plus :)

QT       += core gui

TARGET = leterrier-memory
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h \
    version.h

FORMS    += mainwindow.ui

include(lib/abuleduapplicationv1/abuleduapplicationv1.pri)
include(lib/abuleduconstantesv1/abuleduconstantesv1.pri)
include(lib/abuledunetworkaccessmanagerv1/abuledunetworkaccessmanagerv1.pri)
include(lib/abuledumessageboxv1/abuledumessageboxv1.pri)
include(lib/abuleduidentitesv1/abuleduidentitesv1.pri)
include(lib/abuleduflatboutonv1/abuleduflatboutonv1.pri)
include(lib/maia/maia.pri)

Si vous lancez la compilation maintenant vous allez attendre un certain temps ... en effet on vient de rajouter plus de 8000 lignes de code source dans le projet !

Mais, mais ... mais ... à quoi ça sert ces 8000 lignes de code ? Hé bien à cette étape là votre logiciel sera maintenant en mesure de

  • détecter automatiquement la configuration du proxy de connexion à internet
  • détecter l'inactivité de l'utilisateur face à l'application et lui proposer (en fonction de ce que vous ajouterez comme code) une aide, un assistant, une démo interactive ... que sais-je, on détecte "juste" une inactivité le reste c'est à vous de le faire :)
  • détecter si le logiciel est déjà lancé et vous permettra le cas échéant d'interdire une seconde instance de votre logiciel ... encore une fois ça sera à vous d'utiliser ou pas cette information
  • détecter et vous communiquer sous quel ratio de redimensionnement on se trouve (comme ça si vous avez des images à afficher vous pourrez respecter le même ratio que tout le reste du logiciel)
  • lancer une demande pour voir si une mise à jour du logiciel existe

Mais aussi on a automatiquement:

  • un connecteur réseau de type NetworkAccessManager mais un peu plus futé
  • la détection du système d'exploitation en cours et de sa version (rappel on est multiplateforme et parfois ça demande quelques spécificités de code)
  • la gestion automatique de l'authentification et de l'identité de l'utilisateur sur l'infrastructure AbulÉdu
  • des listes de constantes communes à tous les logiciels d'AbulÉdu (résultats des évaluations, liste de mots du genre adverbes, adjectifs, etc.)
  • des boutons plats et sans aucun style
  • des boites de dialogue "style abuledu"
  • un système de communication client / serveur en XML

... ha oui, quand même, c'est vrai que si chaque développeur devait ré-inventer tout ça dans son coin ... ça prendrait du temps !

Modifier le main.cpp pour que ça soit une AbulEduApplicationV1

Le code initial de main.cpp devrait être ceci:

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    
    return a.exec();
}

Il faut le transformer pour qu'il soit comme ça:

#include "abuleduapplicationv1.h"
#include "mainwindow.h"
#include "version.h"

int main(int argc, char *argv[])
{
    AbulEduApplicationV1 a(argc, argv,VER_INTERNALNAME_STR, VER_PRODUCTVERSION_STR, VER_COMPANYDOMAIN_STR, "leterrier");
    a.setAbeApplicationLongName(QObject::trUtf8(VER_FILEDESCRIPTION_STR));

    MainWindow w;
    w.show();
    
    return a.exec();
}

Pour plus de détails concernant AbulEduApplicationV1 je vous conseille de lire la documentation suivante: https://redmine.ryxeo.com/projects/ryxeo/wiki/AbulEduApplicationV1

C'est bon, vous avez tout compris ?

Hé bien maintenant la surprise: plus besoin de faire tout ça à la mano, on a trouvé comment personnaliser l'assistant de création d'applications de Qt Creator ... de ce faire on peut maintenant créer une AbulEduApplicationV1 avec les options en quelques clics !!!!

Ça se passe ici: Créer une AbulÉduApplicationV1 directement dans QtCreator

QR code
Send to friend

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.