Comportement interne de DrawingArea

Voici plus d’informations à propos des choses internes de DrawingArea.

C’est en relation avec la manière dont qt gère les évènements draw envoyés par le serveur X.

D’abord, vous devez savoir qu’un évènement draw est un rectangle dans votre fenêtre que vous devez redessiner.

Ensuite, il y deux manières :

  1. tous les évènements draw X11 sont fusionnés par QT dans un objet Region, qui n’est pas rectangulaire, puis l’évènement QT paint est appelé, et ensuite l’évènement Draw Gambas. Tous les tracés pendant le tracé par le gestionnaire d’évènement draw seront détourés dans cette région.

    Ça fonctionnait comme ça avant mes modifications.

  2. QT ne fusionne rien, et vous obtenez un évènement draw Gambas pour chaque évènement draw X11. Le dessin est détouré par le rectangle.

    Ça fonctionne comme ça maintenant.

Pourquoi avoir fait ça?

Logiquement, pendant l’évènement du gestionnaire de tracé, vous devez dessiner le moins de choses possible pour accélérer le tracé.

La seule façon dans Gambas de savoir ce qu’il faut tracer est d’utiliser la propriété Clip de la classe Draw.

Dans le premier cas, pendant que le tracé est détouré dans la région, Draw.Clip.[X/Y/W/H] retourne le plus petit rectangle qui inclut la région.

Mais, par exemple, quand vous agrandissez un peu une fenêtre, la région contient deux rectangles : l’un à droite de la fenêtre, l’autre au pied. Et ainsi, le rectangle d’inclusion est la fenêtre entière!

+--------------------------------+---+
|                                | x |      xxx = La région utilisée par Qt
|                                | x |
|                                | x |
|                                | x |
|                                | x |
|                                | x |
|                                | x |
|                Ancienne taille | x |
|                                | x |
+--------------------------------+ x |
|xxxxxxxxxxxxxx Nouvelle taille xxxx |
+------------------------------------+

Quand vous pouvez facilement tracer un sous-rectangle quelconque de votre surface de tracé, la deuxième manière est meilleure.

Quand vous ne pouvez pas faire ça facilement, c.a.d. quand votre dessin est trop complexe pour être facilement partagé en rectangles, vous préférez tout tracer chaque fois que vous recevez un évènement Draw. Alors vous faites le travail deux fois ou plus à comparer avec la première manière. C’est donc au moins deux fois plus lent.

La solution est d’avoir une propriété dans DrawingArea pour lui dire de fusionner ou non les évènements de tracé.

C’est la propriété merge ?.