#  Prise en main de l'IDE QtCreator

Ce TP a pour but de vous faire prendre en main l'IDE, découvrir le débogeur, valgrind (memcheck) et s'assurer que tout va bien.

Disclaimer: Pas mal d'IDE intègrent bien Qt, notamment `clion`. QtCreator
présente l'aventage d'être plutôt léger, d'être libre et bien packagé.

## Installation de la doc de cppreference dans QtCreator

QtCreator permet de parcourir la documentation de Qt. Nous pouvons aussi ajouter la documentation plus générale du C++ de *cppreference.com*. Pour ce faire:

* Barre de menu en haut -> Tools -> Options -> Help -> Documentation (onglet)
* Clickez sur *Add*
* Donnez le chemin `/usr/share/cppreference/doc/qch/cppreference-doc-en-cpp.qch`

Si vous voulez faire de même sur vos machines debian ou dérivés, il faut ajouter le paquet `cppreference-doc-en-qch`.

## Pimpez votre IDE

* Faites un tour dans les préférences et customisez à votre goût.
* Suggestions:
  * Fond sombre
  * Répertoire de `build` par défaut dans `/tmp/`
  * Nom des header par défaut en `.hpp`

## Premier projet 

* Créez un nouveau projet : 
  * Vous avez le choix entre "Application Qt" (avec et sans graphismes) ou "Application non Qt" (typiquement pour du pur C++).
    * Application Qt en console : pour notre première application. Pas de graphisme, mais le mécanisme de signaux et de slots.
    * Application graphique. Prendre une version QML (Pas de widgets). Sur un Qt récent vous pouvez faire un projet en mode "compatibilité" pour des outils compatibles avec du Qt 5.
  * Pour le moment, on va commencer avec une application non Qt.
  * Pour le système de build, on va prendre du qmake, mieux supporté par la version de votre IDE. `cmake` est le standard mis en avant depuis la version 6.

**Note sur la sélection des kits:** Un kit est une association entre un compilateur, un debogueur, une version de Qt, une architecture cible (ex. ARM ou x86), plus un mode de compilation. Les modes de compilations proposés sont:

* Release : binaire optimisé pour la vitesse d'exécution.
* Debug : binaire en mode débug, avec les symboles de débogages et les bibliothèques en mode débogage. Beaucoup plus gros, mais permet d'utiliser le débogueur
* Profile : binaire instrumenté pour utiliser un *profiler*, un outil qui permet de calculer lors d'une exécutions des statistiques sur les différentes fonctions de votre code (nombre d'appel, temps passé), afin d'identifier les parties à optimiser.
* Embarqué / optimisé pour la mémoire

Votre machine devrait être configurée pour vous proposer un seul kit, avec les quatres modes de compilation. Laissez au moins debug.


* Ne prenez pas de gestionnaire de version pour ce premier test. Plus tard, versionnez!

### Code du premier projet

* Faites un "Hello World" (normalement généré tout seul).
* Vérifier que tout va bien (exécutez, compilez).
* Regarder la barre d'onglets horizontale inférieure (notamment sortie de l'application et compilation).

# Utilisation d'un débogueur

 Contexte

L'objet de ce tutorial est de vous familiariser avec l'usage d'un IDE. Nous utiliserons l'IDE léger QtCreator. 

L'exemple se déroule sur le projet `liste_chainee` qui reprend une liste chaînée, mais version C++, avec quelques problèmes qu'on va détecter puis corriger grâce à l'IDE. Ce code contient quelques points non vus encore en cours, ne vous inquiétez pas.

# Lancement et ouverture

Ouvrez `liste_chainee.pro`. Vous pouvez aussi utiliser la ligne de commande avec `qtcreator liste_chainee.pro &`

Choisissez le kit de compilation par défaut.

Parcourez les différents fichiers du projet.

# Ça ne compile pas !

* Essayer d'exécuter (flêche droite en bas à gauche). Ça ne compile pas: il manque le getter de `ListString::m_size`.
* Utilisez le *refactor* pour générer le getter :
  - Ouvrez `ListString.hpp`.
  - Cherchez la déclaration de l'attribut `m_size`. 
  - Clic droit dessus pour avoir le menu contextuel.
  - Puis *Refactoriser -> Generate Getter*.

![Menu refactor](images/refactor.png)

\newpage

* Suivant votre configuration de QtCreator, vous pouvez utiliser à nouveau le *refactor* pour déplacer corps du getter vers le fichier `cpp`.
* Compilez pour vérifier que ça passe (icône marteau en bas à gauche).


# Débogage

## Ça boucle !

* Exécutez le projet (flèche verte en bas à gauche). Ça boucle ! Arrêtez l'exécution en fermant le terminal interne attaché à l'exécution.
* Allez ensuite dans l'onglet *Debug*. Choisissez `Débogueur` dans la liste déroulante des outils. 

![Bien choisir l'outil appelé débogueur](images/debogueur.png)

\newpage

* Mettez un *point d'arrêt* dans le *main*, sur la ligne du premier `for`. Pour ce faire, cliquez dans l'espace libre à gauche des numéros de lignes. Un gros point rouge doit apparaître.
* Lancez le débogage du projet.
* Vous vous retrouvé bloquez sur le point d'arrêt. Repérérez bien la flêche jaune qui indique la position d'exécution courante.
* Vous pouvez avancer d'une ligne en cliquant sur *Passer* (1 sur l'image). Le bouton *Entrer Dans* (2 sur l'image) permet de suivre l'exécution dans le corps d'une fonction.

![Les boutons d'action du débogueur](images/boutons_debug.png)

* Ainsi de suite, trouvez où vous restez bloqués.
* Bon, maintenant, observez en détail le contenu de la variable `matin` (dans la barre à droite). Trouvez ce qui foire dedans.
* Maintenant, arrêtez l'exécution (carré rouge). Recommencez, en utilisant éventuellement des points d'arrêt pour aller plus vite, et trouvez la ligne de code qui merde. 
* Corrigez.

# Ça segfault !

* Ah merde, maintenant, il y a une segfault!
* Lancez **en mode débogage** .
* Regardez la pile d'appel.
* Corrigez! Passez à la suite!

# Ça fuit !

* Changez maintenant d'outil: toujours dans la perspective *Debug*, changer l'outil de *Debogueur* à *Memcheck*. Relancez le progamme en debug. Que dit Valgrind? Ou sont alloués les octets perdu? Corrigez le code.

# Memcheck / Valgrind voit encore des erreurs

* Il y a des encore de la mémoire accédée alors qu'elle a été libérée. Vous le verrez avec un `memcheck`.
* Réfléchissez et corrigez!


# Exemples de Qt

* Des projets-exemples Qt sont disponibles via l'IDE dans l'onglet
`Accueil`, dans la page `Exemples`, ainsi que dans la page `Tutoriel`.



