Composants supplémentaires: Listes et Grilles

Gestion de QListBox

Afin d'expérimenter l'utilisation des composants QListBox, nous allons créer une application permettant de gérer les groupes d'utilisateurs UNIX. Notre application permettra l'ajout /suppression d'utilisateurs à un groupe.

Figure 38. QListBox

QListBox

Notes à propos du système : On supposera que le shadow suite est installée. La liste des utilisateurs se trouve dans le fichier "/etc/shadow". La liste des groupes se trouve dans le fichier "/etc/gshadow".

Pour plus de commodité (et de sécurité) un jeu d'essai est fourni en annexe. Copiez le jeu d'essai dans le répertoire de votre application pour pouvoir disposer d'un accès exclusif à ces fichiers.

/*** référencer le début d'appli dans un lien tgz ***/ Afin de vous donner des pistes de développement, un début d'application a été développé et se trouve dans /tmp/archusers.tar.gz copiez cette archive compressée à l'endroit ou vous souhaitez la décompresser.

   $>cp /tmp/archusers.tar.gz ~/monrepertoire
   $>cd ~/monrepertoire && tar -xzvf archusers.tar.gz 

un répertoire sera créé dans lequel se trouve le projet à compléter.

Quelques indications :

   void FormUsers::init()
   {
   //ouverture du fichier des groupes et chargement dans la liste
   ChargeFichiers();
   }

à l'initialisation de "FormUsers", on déclenche le slot "ChargeFichiers()".

   void FormUsers::ChargeFichiers()
 {
   QTextIStream ficGroup(fopen("./gshadow","r"));
   // Déclaration d'une instance de la classe QTextIstream nommée ficGroup.
   // et en même temps appel du constructeur de la classe avec en
   // paramètre un handle de fichier valide obtenu par fopen("./gshadow","r").

   QString ligneGrp; //cette variable contient au fur et à mesure de la
   // lecture du fichier, une des lignes du fichier ficGroup.
  
  while(!ficGroup.atEnd()) //on utilise ici la méthode atEnd de la
   classe QTextIStream qui renvoie un booléen
   {
   ficGroup >>ligneGrp; 
   // Utilisation du QTextIStream équivalent au   cin>>maVariable
   // l'origine n'étant pas le clavier mais ficGroup 

   // ajout du groupe à la liste
   QStringList SLGroup= QStringList::split( ":", ligneGrp );
   
   // Construction ici d'une QStringList Liste de QString dont les
   // éléments sont obtenus à partir d'un split de la chaîne lue dans le
   // fichier.
   QString nomGrp=SLGroup.first();
   
   // La méthode first() de la classe QStringList renvoie la première
   // QString de la liste.
   QString chListeUtils=SLGroup.last();

   // La méthode last() de la classe QStringList renvoie la dernière
   // QSTring de la liste.
   QStringList listeUtilisateurs=QStringList::split ( ",", chListeUtils );

   groupe * nouveauGroupe= new groupe(nomGrp, listeUtilisateurs);

   // Regardez le fichier groupe.h pour la définition de la classe métier
   // "groupe".
   ListBoxGroups->insertItem(nouveauGroupe);// Le groupe est construit, on
   // procède maintenant à l'insertion du groupe dans la QlistBox des  groupes.
   } // End While
}

// =====================================================================

   void FormUsers::affusers( QListBoxItem * grp )
   // Ce slot est déclenché lorsque le groupe sélectionné change
   // Quand on change le groupe on va afficher les utilisateurs que ce
   // groupe contient

   {
   ListBoxUsersIn->clear();
   ListBoxUsersIn->insertStringList(((groupe ) grp)->users);
   /*********************************************************************/
   // À faire ici obtention des utilisateurs
   // Affichage des utilisateurs
   // Retrait des utilisateurs qui sont déjà dans le groupe.
   /*********************************************************************/
   }

Travail à réaliser

  1. Compléter le slot affusers (partie "à faire ici")

  2. Écrire le slot correspondant déclenché par un clic sur le bouton "supprimer" du groupe bouton >>.

  3. Écrire le slot correspondant au clic sur le bouton ajouter au groupe "<<".

  4. Écrire le slot correspondant à la sauvegarde (seul gshadow est mis à jour).

  5. Complétez l'application de façon à permettre l'ajout et la suppression de groupes d'utilisateurs.

Et si nous n'avions pas bâclé l'analyse ...

Nous avons créé une classe groupe. Pourquoi ? Parce que une QListBox ne contient que des QListBoxItem *. Or nous gérons des groupes et non des QListBoxItems. la classe groupe hérite de QListBoxItem. La classe QListBox pourra donc les accueillir et les afficher. C'est déjà en soi une bonne chose. Mais ne nous arrêtons pas en aussi bon chemin. Qu'est-ce qu'un groupe devrait savoir faire ? Il est de la responsabilité d'un groupe de gérer ses informations, il est donc de sa reponsabilité de gérer ses utilisateurs. Si l'on enrichi la classe groupe de méthodes supplémentaires, on risque d'aboutir à une programmation + propre. Voyons voir dans quelle mesure: à continuer...

Gestion de grilles

Afin d'expérimenter l'utilisation des widgets QTable, nous allons réaliser une application qui construit le tableau d'amortissement d'un emprunt à annuité constante. Les remboursements pourront être mensuels ou annuels. L'utilisateur rentrera son taux d'intérêt, la durée d'emprunt et le montant emprunté. Il précisera si les remboursements sont annuels ou mensuels.

Indications :

Pour présenter le tableau d'amortissement,on utilisera le Widget QTable.

On obtient le contenu de la cellule de la ligne 3 et de la colonne 2 comme ceci :

   QString contenu=TableEmprunt->text(3,2);

C'est la méthode

setText(int ligne,int colonne,QString contenu) 

qui permet de remplir la cellule avec le contenu indiqué.

Pour obtenir une chaîne QString avec 2 chiffres après la virgule à partir d'un réel double :

   QString nouvelleChaine=QString::sprintf("%.2f",monReel);

Pour changer le nombre de ligne d'un QTable : Table1->setNumRows(18);

Pour obtenir un réel double à partir d'une QString : double v0=LineEditMontant->text().toDouble();

Pour calculer l'annuité : double annuite=v0*i/(1-pow(1+i,(double) -n));