Comportamento Interno do DrawingArea
Aqui está mais informações sobre o comportamento interno do
DrawingArea.
Ela está relacionada com a forma como o
qt consegue desenhar os eventos enviados pelo X Server.
Em primeiro lugar, você deve saber que um evento draw é um retângulo em sua janela que você
deve redesenhar.
Então, há duas maneiras:
-
All X11 são eventos draw mesclados por QT em uma Região do objeto, que não é retangular, e então, o evento QT paint é chamado, e, assim, o evento Gambas Draw. Todos os desenhos durante o manipulador de eventos draw será cortado por esta região.
Funcionou assim antes das minhas modificações.
-
QT sem mesclar, você terá um evento draw do Gambas para cada evento draw do X11. O desenho é cortado pelo retângulo.
Ele funciona assim agora.
Por que está fazendo isso?
Logicamente, durante o manipulador de eventos de desenho, você tem que chamar a menor quantidade de coisas possíveis para acelerar o desenho.
A única maneira do Gambas saber o que desenhar é usando a propriedade
Clip da classe
Draw.
No primeiro caso, como o desenho é cortado pela região,
Draw.
Clip.[X/Y/W/H] retorna o menor retângulo que inclui a região.
Mas, por exemplo, quando você ampliar um pouco a janela, a região contém dois
retângulos: um à direita da janela, o outro na parte inferior. E assim, inclui o retângulo em toda a janela!
+--------------------------------+---+
| | x | xxx = A região utilizada pelo Qt
| | x |
| | x |
| | x |
| | x |
| | x |
| | x |
| Tamanho velho | x |
| | x |
+--------------------------------+ x |
|xxxxxxxxxxxxxxxxx Novo tamanho xxxx |
+------------------------------------+
Quando você pode facilmente desenhar qualquer sub-retângulo em sua Drawingarea, o segundo
caminho é o melhor.
Quando você não pode facilmente fazer isso, ou seja, quando o desenho é muito complexo para ser
facilmente dividido em um retângulo, você prefere desenhar tudo cada vez que você
receber um evento
Draw. E assim, você faz o trabalho duas vezes ou mais vezes em comparação com o primeiro caminho. Por isso, é duas ou mais vezes mais lento.
A solução é ter uma propriedade no
DrawingArea para dizer se deve
ou não mesclar no evento draw.
Esta propriedade é a
merge ?.