QWidget semitransparente sobre QGLWidget: resultados estranhos

Eu tenho um QGLWidget em tamanho real que pinta o fundo do aplicativo usando o QPainter (pode mudar para comandos openGL nativos no futuro).

No topo deste QGLWidget eu uso QWidgets (não-GL) para os elementos da interface do usuário. Estes são, por exemplo, QLineEdits e QPushButtons. Eu os coloco em um QWidget personalizado que usa pintura de fundo semitransparente. Os paintEvents do QLineEdit e QPushButton são sobrescritos e também usam fundos semitransparentes.

A interface do usuário inteiradeve se parecer com o seguinte (Essa é uma captura de tela em que desativei o OpenGL e usei o QWidget em vez do QGLWidget como plano de fundo. Observe a barra superior semi-transparente, que também desenha uma sombra (dentro de sua própria região)):

Quando o QLineEdit tem o foco, ele deve ter uma opacidade maior, mas ainda não totalmente opaco:

Portanto, agora, com o OpenGL ativado (o segundo plano é um QGLWidget), os widgets semitransparentes acima não pintam em cima do segundo plano, mas em (parece ser) dados não inicializados. A imagem que brilha na barra superior é, às vezes, a própria janela inteira e, às vezes, outras janelas atualmente em minha área de trabalho.

Isso atualmente parece com o seguinte (Nesta captura de tela, os dados nos quais as operações de pintura semitransparente são pintadas parecem ser uma imagem do próprio widget, tendo um deslocamento.):

Quando eu escrevi o texto para a edição de linha (aqui: "Este é um texto que já existia!"), Removi e coloquei o foco de volta no widget de fundo (para que o ícone da lupa e o texto do espaço reservado apareçam) coisas pintadas ainda brilham (Observe que a borda visível devenão ser mais visível, mas também ainda brilha):

Portanto, o problema é: em vez de ser pintado sobre os widgets subjacentes, o widget semitransparente é pintado na parte superiorresultados antigos, inicialmente sendo algo como "memória não inicializada".

Por que isso acontece? Como posso resolver o problema?

Coisas que você deve saber antes de responder:

A cena de fundo é uma composição de blocos que são renderizados fora da tela. Por isso, pode ser pintado muito rapidamente e repintar o fundo para cada pequena alteração da sobreposição não é problemática.A barra superior é um QWidget personalizado com pintura manual e disposição dos dois widgets contidos (o botão e a edição de linha).Os dois widgets sobrescrevem o paintEvent, apenas desenham seu próprio fundo (semitransparente) quando têm foco e não usam frames já fornecidos pelo Qt. Assim, a borda branca na segunda captura de tela é desenhada no meu paintEvent personalizado.Eu quero que o fundo e a composição dos widgets de sobreposição sejam implementáveis ​​separadamente. O fundo é umAbstractMapView que tem algumas classes concretas de visualização de mapas. A janela inteira é umaAbstractView (também há várias visualizações concretas), que contêm uma visualização de mapa concreta e os widgets de sobreposição, compostos de uma maneira que ela própria decide. Portanto, não quero que a lógica dos widgets de sobreposição façam parte da visualização do mapa subjacente. (Espero que você tenha entendido isso, pois é um pouco complicado.)