# Communication C++ / QML"

L'objectif de ce TP est d'apprendre à faire interagir C++ et QML. 
Vous utiliserez QtCreator. Vous pouvez utilisez si vous le souhaitez les `QtQuick.Controls.`.

## Une classe NetworkInterface

Écrivez une classe C++ `NetworkInterface` (Abrégé par la suite en *NI*). Cette
classe représente une interface réseau de votre machine et va interagir avec QML (notamment être affichée).

Elle s'appuiera (sans en hériter, c'est une façade) sur la classe `QNetworkInterface` de Qt. Cette
dernière est un peu compliquée pour notre besoin et n'a rien de prévu pour être
accédée depuis QML. Nous complèterons son contenu au cours du TP.

### Premier jet

La classe *NI* a un attribut, de type `QNetworkInterface`, passé en paramètre à
la construction. Pour tester, je vous invite à regarder la méthode
`QNetworkInterface::interfaceFromName` et vous rappelle que vous avez toujours
au moins une interface réseau (`lo`), et sans doute un `eth0` ou un `wlan0` (les noms peuvent varier).

Ajoutez une méthode publique `name` permettant d'avoir le nom de l'interface.

### Un peu de QML

Créez un *NI* dans votre `main`. Rendez cette instance visible dans QML.

Affichez le nom de votre interface dans la page QML.

### Compléter *NI*

Ajoutez des méthodes `physicalAddress` et `address` à votre classe *NI*. Ces
méthodes renvoient des `QString`.

Affichez les résultats dans QML.

### Appel d'une méthode CPP depuis QML

Ajoutez une méthode `shutdown` à *NI*. Cette méthode ne fait qu'afficher en
texte un message (vous n'avez pas les droits sur les machines pour
tomber les interfaces réseau).

Ajoutez au QML un bouton ou un rectangle clickable qui appelle le `shutdown` de votre
*NI*.

### Un attribut propre

Ajoutez une propriété `myName` à l'interface. Cette propriété s'appuie sur un
attribut de type `QString` nommé `m_myName`.

`myName` est initialisé à la construction avec le nom de l'interface (il pourra
par la suite être différent).

Affichez *myName* à la place de *name* dans le QML

### Dépendance

Modifiez la méthode `shutdown` pour qu'elle change le nom perso de l'interface.
Si nécessaire, ajoutez ce qu'il faut pour que l'affichage soit actualisé.

### Saisie

Ajoutez un composant QML dans votre page pour permettre d'éditer le nom long
(*myName*) de l'interface réseau. Le nom est changé quand vous validez votre
saisie

### Saisie en continu

Modifiez le composant QML précédent pour que le nom de l'interface soit changé à
chaque modification du champs de saisie.

### Utile pour la suite des TP

* Ajoutez l'affichage de certaines propriétés QML dans la console Javascript dés
que votre fenêtre est affichée.


## L'essentiel est bouclé, place au facultatif

Ajoutez les éléments suivants à votre interface:

* Une image de fond
* Un champ de saisie pour taper le nom (court) d'une nouvelle interface (remplace la
précédente, on a pas vu les List/Model encore).
* La même chose avec une liste déroulante
* Une gestion correcte du redimentionnment
* Un ensemble de checkbox qui permette de masquer ou d'afficher les champs de
l'interface.
