QWidget semitransparente sobre QGLWidget: resultados extraños

Tengo un QGLWidget de tamaño completo que pinta el fondo de la aplicación usando QPainter (podría cambiar a comandos openGL nativos en el futuro).

Además de este QGLWidget, utilizo QWidgets (no GL) para los elementos de la interfaz de usuario. Estos son, por ejemplo, QLineEdits y QPushButtons. Los puse en un QWidget pintado personalizado que utiliza pintura de fondo semitransparente. Los paintEvents de QLineEdit y QPushButton se sobrescriben y también utilizan fondos semitransparentes.

Toda la interfaz de usuariodebe parecerse a lo siguiente (Esta es una captura de pantalla donde inhabilité OpenGL y usé QWidget en lugar de QGLWidget para el fondo. Observe la barra superior semitransparente que también dibuja una sombra (dentro de su propia región)):

Cuando el QLineEdit tiene el foco, debería tener una opacidad más alta pero aún no completamente opaca:

Así que ahora, con OpenGL habilitado (el fondo entonces es un QGLWidget), los widgets semitransparentes de arriba no se pintan en la parte superior del fondo, sino en (no parece) los datos sin inicializar. La imagen que brilla a través de la barra superior es a veces la ventana completa y otras ventanas que están actualmente en mi escritorio.

Esto actualmente se parece a lo siguiente (En esta captura de pantalla, los datos en los que se pintan las operaciones de pintura semitransparentes parecen ser una imagen del propio widget, con un desplazamiento).

Cuando escribí el texto en la línea de edición (aquí: "Este es un texto que ha estado allí antes"), lo quité y configuré el foco de nuevo en el widget de fondo (para que aparezcan el icono de la lupa y el texto del marcador de posición), el anterior Las cosas pintadas todavía brillan a través de (Tenga en cuenta que el borde visible debeno ser visible más, pero también brilla a través de):

Así que el problema es: en lugar de pintarse encima de los widgets subyacentes, el widget semitransparente se pinta encima delresultados antiguos, inicialmente siendo algo así como "memoria no inicializada".

¿Por qué pasó esto? ¿Cómo puedo solucionar el problema?

Cosas que debes saber antes de contestar:

La escena de fondo es una composición de mosaicos que se representan fuera de la pantalla. Por lo tanto, se puede pintar muy rápido y no es problemático repintar el fondo por cada pequeño cambio de la superposición.La barra superior es un QWidget personalizado con pintura manual y disposición de los dos widgets contenidos (edición de botón y línea).Los dos widgets sobrescriben el paintEvent, solo dibujan su propio fondo (semitransparente) cuando tienen el foco y no usan marcos que Qt ya proporcionó. Así que el borde blanco en la segunda captura de pantalla se dibuja en mi paintEvent personalizado.Quiero que el fondo y la composición de los widgets de superposición sean implementables por separado. El fondo es unAbstractMapView que tiene algunas clases concretas de vista de mapa. Toda la ventana es unaAbstractView (también hay varias vistas concretas), que contiene tanto una vista de mapa concreta como los widgets de superposición, compuestos de la misma manera que se decida. Por lo tanto, no quiero que la lógica de los widgets de superposición sea parte de la vista del mapa subyacente. (Espero que hayas entendido esto, ya que es un poco complicado).

Respuestas a la pregunta(2)

Su respuesta a la pregunta