<p class="spip"><a href="http://www.coagul.org/article.php3?id_article=417" class="spip_out">Dans le tutoriel précédent</a>, j’ai détaillé la création d’une QListView utilisée pour lire le fichier d’exercices. Nous allons intégrer ces fonctions dans le formulaire présenté <a href="http://www.coagul.org/article.php3?id_article=409" class="spip_out">dans le tutoriel 3</a>.</p>

<h3>Éléments abordés dans ce document</h3>
<li> Utilisation de l’IDE Eric
<h3>Au travail</h3>
<p class="spip">Dans l’IDE Eric (il est important de l’avoir installé et configuré comme indiqué <a href="http://www.bawet.org/article.php3?id_article=103" class="spip_out">ici </a></p>

<li> Projet/Nouveau : pour créer un nouveau projet nommé revcal
<br /><li> Projet/Ajouter fichier : pour ajouter le fichier mainform.ui
<br /><li> Compiler le formulaire avec un clic droit sur le fichier mainform.ui présent dans l’onglet des formulaires. Une boite de dialogue apparaît pour signaler le succès de l’opération. Dans l’onglet des sources apparaît maintenant le fichier mainform.py
<br /><li> Générer une sous-classe avec un clic droit sur le fichier mainform.ui en acceptant le nom proposé par défaut (MainForm_Impl).
<br /><li> Sauver le fichier en l’appelant mainform_impl.py
<br /><li> Ajouter ce fichier dans les sources du projet
<br /><li> Créer un nouveau fichier qu’on appellera revcal.py. Celui-ci contiendra les lignes suivantes :
<div style='text-align: left;' class='spip_code' dir='ltr'><code><br />
# !/usr/bin/env python<br />
<br />
import sys<br />
from qt import *<br />
from mainform_impl import MainForm_Impl<br />
<br />
# create Qt application<br />
app = QApplication(sys.argv)<br />
<br />
# create and show Qt form<br />
form = MainForm_Impl()<br />
form.show()<br />
<br />
# enter Qt event-handling loop<br />
app.exec_loop() <br />
</code></div>
<li> Ajouter ce fichier dans les sources du projet
<br /><li> Désigner ce fichier comme étant le fichier principal du projet dans Projet/propriétés
<br /><li> lancer le programme avec la touche F2 puis en cliquant sur OK. Magnifique, non ?
<p class="spip">Il serait vraiment dommage de s’arrêter en si bon chemin. On va donc ajouter le code correspondant à la lecture du fichier d’exercices vu dans <a href="http://www.coagul.org/article.php3?id_article=417" class="spip_out">le tutoriel précédent</a>. Celui-ci prendra tout naturellement place dans la fonction init() du fichier MainForm_Impl.py</p>
<div style='text-align: left;' class='spip_code' dir='ltr'><code><br />
def init(self):<br />
        items=[]<br />
        items.append(QListViewItem(self.ExerciseListView,"Additions"))<br />
        items.append(QListViewItem(self.ExerciseListView,"Divisions"))<br />
        items.append(QListViewItem(self.ExerciseListView,"Multiplications"))<br />
        items.append(QListViewItem(self.ExerciseListView,"Soustractions"))<br />
<br />
        try:<br />
            fsock = open('exercices.txt')<br />
            try:<br />
                dataLines = [line for line in fsock.readlines() if line[0]!='#']<br />
            finally:<br />
                fsock.close()<br />
        except IOError:<br />
            pass<br />
<br />
        try:<br />
            for dataLine in dataLines:<br />
                exercice, oorq, delai, question = re.findall("^([^\\t]+)\\t+([^\\t]+)\\t+(\\d+)\\t+(\\d+)",dataLine)[0]<br />
                op1Min, op1Max, q1, operateur, op2Min, op2Max, q2, max, q3 = re.findall("^\\[([0-9]{1,3})..([0-9]{1,3})\\](_?)([+\\-*/])\\[([0-9]{1,3})..([0-9]{1,3})\\](_?)<=([0-9]{1,3})(_?)$", oorq)[0]<br />
                items.append(QListViewItem(items[['+', '/', '*', '-'].index(operateur)], unicode(exercice,'utf8'), oorq, delai, question))<br />
        except NameError:<br />
            pass<br />
</code></div>
<li> Lancer à nouveau le programme avec la touche F2 puis en cliquant sur OK vous obtiendrez ceci :
<span class='spip_document_819 spip_documents spip_documents_center' >
<img src='http://download.tuxfamily.org/assocoagul/drupal-files/spip/revcal-2.jpg' width="638" height="528" alt="" /><span>
<li> A ce stade, les plus perspicaces d’entre vous devraient s’interroger. Comment se fait-il qu’un clic sur une ligne d’exercice remplisse les zones de saisie situées dans la partie supérieure du formulaire ?
<p class="spip">En fait il suffit de rajouter le code suivant dans la fonction SelectExerciseSlot</p>
<div style='text-align: left;' class='spip_code' dir='ltr'><code><br />
    def SelectExerciseSlot(self):<br />
        exercise=self.ExerciseListView.currentItem().text(1).ascii()<br />
        if exercise:<br />
            op1Min, op1Max, q1, operateur, op2Min, op2Max, q2, max, q3 = re.findall("^\\[([0-9]{1,3})..([0-9]{1,3})\\](_?)([+\\-*/])\\[([0-9]{1,3})..([0-9]{1,3})\\](_?)<=([0-9]{1,3})(_?)$", exercise)[0]<br />
            self.MinOp1LineEdit.setText(op1Min)<br />
            self.MaxOp1LineEdit.setText(op1Max)<br />
            self.OperateurComboBox.setCurrentItem(['*', '+', '-', '/'].index(operateur))<br />
            self.MinOp2LineEdit.setText(op2Min)<br />
            self.MaxOp2LineEdit.setText(op2Max)<br />
            self.ResultatMaxLineEdit.setText(max)<br />
            self.PositionLineEdit.setText(`(q1=='_')+(q2=='_')*2+(q3=='_')*4`)<br />
            self.CountLineEdit.setText(self.ExerciseListView.currentItem().text(3).ascii())<br />
            self.DelaiLineEdit.setText(self.ExerciseListView.currentItem().text(2).ascii())<br />
        else:<br />
            operateur=self.ExerciseListView.currentItem().text(0).ascii()<br />
            self.OperateurComboBox.setCurrentItem(['Multiplications', 'Additions', 'Soustractions', 'Divisions'].index(operateur))<br />
</code></div>
<p class="spip">Tous les fichiers de ce tutoriel sont dans l’archive suivante :</p>
<dl class='spip_document_820 spip_documents spip_documents_center' >
<dt><a href="http://download.tuxfamily.org/assocoagul/drupal-files/spip/revcal.zip" title='Zip - 43.9 ko' type="application/zip"><img src='dist/vignettes/zip.png' width='52' height='52' alt='Zip - 43.9 ko' /></a><dt>
</dl>
<h2>Liens</h2>
<a href="http://www.bawet.org/article.php3?id_article=99" class="spip_out">Installer Python-Qt3 / QtDesigner sur Ubuntu Breezy 5.10</a>
<p class="spip"><a href="http://www.bawet.org/article.php3?id_article=103" class="spip_out">Programmer en PyQt avec Eric3 / QtDesigner</a></p>

<p class="spip"><a href="http://www.coagul.org/article.php3?id_article=433" class="spip_out">Pour la suite, c’est ici</a></p>

<h2>Historique des modifications</h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Version</strong></th><th scope='col'><strong class="spip">Date</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>0.1</td><td>26/03/2006</td><td>Création par Jibux</td></tr>
<tr class="row_odd"><td>0.2</td><td>26/11/2006</td><td>Ajout d’un lien vers l’article suivant</td></tr>
</tbody>
</table>