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:

  1. 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.

  2. 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 ?.