on va connecter tous les signaux de changement (propres à chacun des widgets) à la
même méthode slot declareSaisieEnCours. On peut ainsi facilement intercepter
n'importe quelle action atomique de saisie — frappe d'une touche clavier, sélection
dans la liste déroulante, etc. — et réagir de la même manière (voir point ).
La méthode declareSaisieEnCours désactive le bouton Nouveau (pour ne pas
risquer de perdre le contenu des champs saisis) ; ensuite on teste si la saisie est
valide en regardant simplement si le champ "Titre" est vide (par précaution, on
appelle la méthode Python strip(), qui élimine les espaces éventuels et ainsi
détecte les titres blancs) ; enfin, on rend le bouton Sauvegarder activable selon que
cette la saisie est valide ou non.
La méthode modificationAEnregistrer est appelée chaque fois que les champs
saisis sont rapatriés dans le modèle ; c'est donc le bon moment pour rendre le
bouton Nouveau activable et le bouton Sauvegarder non-activable.
Lorsque la sélection change, on teste si une saisie est en cours en regardant l'état du
bouton Sauvegarder ; le cas échéant, on le signale à l'utilisateur et on demande sa
confirmation.
Si l'utilisateur se ravise, il faut faire en sorte de revenir à la ligne précédemment
sélectionnée (ou pas de sélection, dans le cas d'un nouveau livre). À cette fin, on
utilise les arguments selected et deselected pour défaire l'action de l'utilisateur :
on désélectionne la ligne sélectionnée et on resélectionne la ligne sélectionnée, si
elle existe. Très bien… mais une petite sophistication supplémentaire est encore
nécessaire : si on se contente simplement de changer la sélection comme expliqué,
le signal selectionChanged va être émis et la méthode
on_treeViewLivres_selectionChanged va être à nouveau invoquée ! Pour éviter
cet appel récursif non désiré, on déconnecte temporairement le signal du slot juste
avant l'opération et on le reconnecte juste après. C'est un peu comme un chirurgien
qui endort son patient avant l'intervention : il évite ainsi des cris qui pourraient
compromettre la réussite de l'opération !
À ce niveau, la nouvelle sélection est acceptée (soit qu'il n'y ait pas de saisie en
cours, soit que l'utilisateur ait accepté de la perdre). On fait les mêmes traitements
130
même méthode slot declareSaisieEnCours. On peut ainsi facilement intercepter
n'importe quelle action atomique de saisie — frappe d'une touche clavier, sélection
dans la liste déroulante, etc. — et réagir de la même manière (voir point ).
La méthode declareSaisieEnCours désactive le bouton Nouveau (pour ne pas
risquer de perdre le contenu des champs saisis) ; ensuite on teste si la saisie est
valide en regardant simplement si le champ "Titre" est vide (par précaution, on
appelle la méthode Python strip(), qui élimine les espaces éventuels et ainsi
détecte les titres blancs) ; enfin, on rend le bouton Sauvegarder activable selon que
cette la saisie est valide ou non.
La méthode modificationAEnregistrer est appelée chaque fois que les champs
saisis sont rapatriés dans le modèle ; c'est donc le bon moment pour rendre le
bouton Nouveau activable et le bouton Sauvegarder non-activable.
Lorsque la sélection change, on teste si une saisie est en cours en regardant l'état du
bouton Sauvegarder ; le cas échéant, on le signale à l'utilisateur et on demande sa
confirmation.
Si l'utilisateur se ravise, il faut faire en sorte de revenir à la ligne précédemment
sélectionnée (ou pas de sélection, dans le cas d'un nouveau livre). À cette fin, on
utilise les arguments selected et deselected pour défaire l'action de l'utilisateur :
on désélectionne la ligne sélectionnée et on resélectionne la ligne sélectionnée, si
elle existe. Très bien… mais une petite sophistication supplémentaire est encore
nécessaire : si on se contente simplement de changer la sélection comme expliqué,
le signal selectionChanged va être émis et la méthode
on_treeViewLivres_selectionChanged va être à nouveau invoquée ! Pour éviter
cet appel récursif non désiré, on déconnecte temporairement le signal du slot juste
avant l'opération et on le reconnecte juste après. C'est un peu comme un chirurgien
qui endort son patient avant l'intervention : il évite ainsi des cris qui pourraient
compromettre la réussite de l'opération !
À ce niveau, la nouvelle sélection est acceptée (soit qu'il n'y ait pas de saisie en
cours, soit que l'utilisateur ait accepté de la perdre). On fait les mêmes traitements
130
