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:
-
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.
-
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 ?).