La couleur du rectangle est sélectionnée en fonction des boutons enfoncés sur la
souris. Ils sont indiqués par mouseArea.pressedButtons, sous la forme d'une
valeur qui condense tous les boutons possibles. Les boutons spécifiques sont alors
récupérés un à un par une opération ET binaire : par exemple,
mouseArea.pressedButtons & Qt.LeftButton prend la valeur vraie quand le
bouton gauche est appuyé.
Une comparaison directe comme mouseArea.pressedButtons ==
Qt.LeftButton n'est vraie que quand seul le bouton gauche est appuyé. Ainsi, si le
bouton droit, le bouton central ou tout autre bouton présent sur la souris (retour
arrière, marche avant ou un autre bouton) est enfoncé, l'égalité stricte ne sera pas
vraie. Ainsi, il est assez rare d'utiliser cette comparaison directement, même quand
elle pourrait sembler justifiée de prime abord.
Par défaut, MouseArea ne gère que les clics gauche : il faut activer les autres un par
un dans la propriété acceptedButtons, avec une combinaison similaire à ce qui est
utilisé pour la propriété pressedButtons , mais utilisant le OU binaire.
Chaque fois qu'un signal touchant à la souris est détecté (appui et déplacement), les
opérations de dessin sont demandées.
La fonction requestPaint ne lance cependant pas le rendu immédiatement : elle ne
fait que signaler au moteur de rendu de Qt Quick que le composant Canvas doit
mettre à jour son affichage (ajouter un point). Ce dernier n'est pas obligé d'accéder
à cette requête immédiatement, il peut la retarder (souvent, de quelques
millisecondes au plus, ce qui n'a généralement pas d'impact sur le rendu).
Le rendu à l'écran de cette implémentation simple ne sera pas idéal. Notamment, si
vous déplacez la souris trop vite, vous passerez pour un adepte de Seurat : les
événements de souris ne sont pas envoyés de manière continue, mais bien
échantillonnés. Si l'écart entre deux événements est trop grand, les points dessinés
seront distants l'un de l'autre. Le problème est qu'il n'est pas possible de contrôler cette
fréquence d'échantillonnage ; la solution est donc de mémoriser l'emplacement du point
précédent et de dessiner une courbe entre l'ancien point et celui qui vient d'être ajouté
— très souvent, il s'agit d'une cerce (spline), mais Canvas ne propose que des lignes
440
souris. Ils sont indiqués par mouseArea.pressedButtons, sous la forme d'une
valeur qui condense tous les boutons possibles. Les boutons spécifiques sont alors
récupérés un à un par une opération ET binaire : par exemple,
mouseArea.pressedButtons & Qt.LeftButton prend la valeur vraie quand le
bouton gauche est appuyé.
Une comparaison directe comme mouseArea.pressedButtons ==
Qt.LeftButton n'est vraie que quand seul le bouton gauche est appuyé. Ainsi, si le
bouton droit, le bouton central ou tout autre bouton présent sur la souris (retour
arrière, marche avant ou un autre bouton) est enfoncé, l'égalité stricte ne sera pas
vraie. Ainsi, il est assez rare d'utiliser cette comparaison directement, même quand
elle pourrait sembler justifiée de prime abord.
Par défaut, MouseArea ne gère que les clics gauche : il faut activer les autres un par
un dans la propriété acceptedButtons, avec une combinaison similaire à ce qui est
utilisé pour la propriété pressedButtons , mais utilisant le OU binaire.
Chaque fois qu'un signal touchant à la souris est détecté (appui et déplacement), les
opérations de dessin sont demandées.
La fonction requestPaint ne lance cependant pas le rendu immédiatement : elle ne
fait que signaler au moteur de rendu de Qt Quick que le composant Canvas doit
mettre à jour son affichage (ajouter un point). Ce dernier n'est pas obligé d'accéder
à cette requête immédiatement, il peut la retarder (souvent, de quelques
millisecondes au plus, ce qui n'a généralement pas d'impact sur le rendu).
Le rendu à l'écran de cette implémentation simple ne sera pas idéal. Notamment, si
vous déplacez la souris trop vite, vous passerez pour un adepte de Seurat : les
événements de souris ne sont pas envoyés de manière continue, mais bien
échantillonnés. Si l'écart entre deux événements est trop grand, les points dessinés
seront distants l'un de l'autre. Le problème est qu'il n'est pas possible de contrôler cette
fréquence d'échantillonnage ; la solution est donc de mémoriser l'emplacement du point
précédent et de dessiner une courbe entre l'ancien point et celui qui vient d'être ajouté
— très souvent, il s'agit d'une cerce (spline), mais Canvas ne propose que des lignes
440
