Comportamento interno della DrawingArea

Qui ulteriori informazioni sugli elementi interni della DrawingArea.

Il comportamento è legato al modo in cui qt gestisce gli eventi di disegno inviati dal Server X.

Innanzitutto, devi sapere che un evento di disegno è un rettangolo nella finestra che devi ridisegnare.

Quindi ci sono due modi:
  1. Tutti gli eventi di disegno X11 vengono uniti da QT in un oggetto Region, che non è rettangolare, quindi viene chiamato l'evento paint di QT e quindi l'evento Gambas Draw. Tutti i disegni durante il gestore dell'evento draw verranno ritagliati da questa regione.

    Funzionava così prima delle mie modifiche.

  2. QT non unisce nulla e ottieni un evento di disegno Gambas per ogni evento di disegno X11. Il disegno è ritagliato dal rettangolo.

    Ora funziona così.

Perché farlo ?

Logicamente, durante la gestione dell'evento di disegno, è necessario disegnare cose il meno possibile per accelerare il disegno.

L'unico modo in Gambas per sapere cosa disegnare è usare la proprietà Clip della classe Draw.

Nel primo caso, poiché il disegno viene ritagliato dalla regione, Draw.Clip.[X/Y/W/H] restituisce il rettangolo più piccolo che include la regione.

Però, per esempio, quando ingrandisci un po' una finestra, la regione contiene due rettangoli: uno a destra della finestra e l'altro in fondo. E così, il rettangolo incluso è l'intera finestra!

+--------------------------------+---+
|                                | x |      xxx = La regione utilizzata da Qt
|                                | x |
|                                | x |
|                                | x |
|                                | x |
|                                | x |
|                                | x |
|                    Old size    | x |
|                                | x |
+--------------------------------+ x |
|xxxxxxxxxxxxxxxxxxxxx New size xxxx |
+------------------------------------+

Quando puoi facilmente disegnare qualsiasi sub-rettangolo dell'area di disegno, il secondo modo è il migliore.

Quando non puoi farlo facilmente, cioè quando il tuo disegno è troppo complesso per essere facilmente diviso in un rettangolo, è preferibile disegnare tutto ogni volta che ricevi un evento Draw. E così, fai il lavoro due o più volte rispetto al primo modo. Quindi è due o più volte più lento.

La soluzione sta nell'avere una proprietà nella DrawingArea che dica di unire e non di disegnare usando gli eventi.

Questa è la proprietà merge (merge ?).