Dans cette boîte de dialogue, on fixe la couleur initiale à celle du premier élément
sélectionné ; ceci n'est pas essentiel, mais c'est plus agréable pour l'utilisateur, surtout
s'il n'y a qu'un seul élément sélectionné. Après avoir vérifié qu'on n'a pas quitté le
dialogue par le bouton Cancel, on vérifie que la couleur choisie est valide ; si oui, on
crée une nouvelle brosse avec cette couleur et on l'assigne à tous les éléments
sélectionnés.
Tout cela est très bien… mais il y a un problème : si l'on clique sur le bouton sans
qu'aucun élément soit sélectionné, il y aura une exception Python sur l'expression
itemsSelectionnes[0]. On peut y remédier très facilement en protégeant les
instructions avec un
if len(itemsSelectionnes) > 0:
…
Du point de vue ergonomique, ceci n'est clairement pas un bon choix : l'utilisateur
clique sur un bouton et rien ne se passe ("Ai-je bien cliqué sur le bouton ?", "Quelque
chose s'est-il passé à mon insu ?", etc.). On pourrait bien sûr afficher un message
d'erreur pour ce cas, mais ce serait faire preuve d'autoritarisme. Il existe évidemment
une meilleure solution : le bouton Changer couleur… ne doit être accessible que s'il y a
au moins un élément sélectionné. C'est précisément ce que font les lignes qui suivent,
grâce au signal selectionChanged émis par la scène chaque fois qu'un élément est
sélectionné ou dé​ sélectionné :
def __init__(self,parent=None):
…
self.scene.selectionChanged.connect(self.onSceneSelectionChanged)
self.onSceneSelectionChanged()
…
def onSceneSelectionChanged(self):
nbElementSelectionnes = len(self.scene.selectedItems())
self.pushButtonChangerCouleur.setEnabled(nbElementSelectionnes > 0)
msg = '%d éléments sélectionnés'%nbElementSelectionnes
self.statusBar().showMessage(msg)
Dans le constructeur, on fait une connexion explicite signal-slot [15] et on invoque
directement la méthode slot onSceneSelectionChanged pour faire les initialisations
nécessaires. Dans onSceneSelectionChanged, on rend le bouton activable si et
seulement si le nombre d'éléments est non nul. Au passage, on affiche un message dans
la barre de statut, en bas de la fenêtre principale, pour indiquer à tout moment le
nombre d'éléments sélectionnés.
222
Précédent

- 223/494

Suivant