Halbtransparentes QWidget über QGLWidget: Seltsame Ergebnisse

Ich habe ein QGLWidget in voller Größe, das den Anwendungshintergrund mit QPainter zeichnet (wird möglicherweise in Zukunft in native openGL-Befehle geändert).

Zusätzlich zu diesem QGLWidget verwende ich QWidgets (ohne GL) für die Elemente der Benutzeroberfläche. Dies sind beispielsweise QLineEdits und QPushButtons. Ich habe sie in ein benutzerdefiniertes QWidget eingefügt, das halbtransparente Hintergrundfarben verwendet. Die PaintEvents von QLineEdit und QPushButton werden überschrieben und verwenden ebenfalls halbtransparente Hintergründe.

Die ganze Benutzeroberflächesollte wie folgt aussehen (Dies ist ein Screenshot, in dem ich OpenGL deaktiviert und QWidget anstelle von QGLWidget für den Hintergrund verwendet habe. Beachten Sie die halbtransparente obere Leiste, die auch einen Schatten zeichnet (innerhalb ihres eigenen Bereichs)):

Wenn das QLineEdit den Fokus hat, sollte es eine höhere Deckkraft haben, aber immer noch nicht vollständig undurchsichtig:

Wenn OpenGL aktiviert ist (der Hintergrund ist dann ein QGLWidget), werden die oben genannten semitransparenten Widgets nicht über den Hintergrund gezeichnet, sondern auf nicht initialisierten Daten (es scheint). Das Bild, das durch die obere Leiste scheint, ist manchmal das gesamte Fenster selbst und manchmal andere Fenster, die sich derzeit auf meinem Desktop befinden.

Dies sieht derzeit wie folgt aus (In diesem Screenshot scheinen die Daten, auf denen die halbtransparenten Zeichenvorgänge gezeichnet werden, ein Bild des Widgets selbst mit einem Versatz zu sein.):

Als ich Text in die Zeilenbearbeitung geschrieben habe (hier: "Dies ist ein Text, der vorher dort war!"), Entfernte ich ihn und stellte den Fokus wieder auf das Hintergrund-Widget (so dass das Lupensymbol und der Platzhaltertext angezeigt werden) gemalte Dinge scheinen noch durch (Beachten Sie, dass der sichtbare Rand solltenicht sichtbar sein, aber auch noch durchscheinen):

Das Problem ist also: Anstatt über die zugrunde liegenden Widgets gezeichnet zu werden, wird das semitransparente Widget über das Widget gezeichnetalte Ergebnisse, anfangs so etwas wie "nicht initialisiertes Gedächtnis".

Warum passiert das? Wie kann ich das Problem lösen?

Dinge, die Sie wissen sollten, bevor Sie antworten:

Die Hintergrundszene ist eine Komposition aus Kacheln, die außerhalb des Bildschirms gerendert werden. So kann es sehr schnell gemalt werden und das Neulackieren des Hintergrunds für jede kleine Änderung der Überlagerung ist nicht problematisch.Die obere Leiste ist ein benutzerdefiniertes QWidget mit manuellem Zeichnen und Anordnen der beiden enthaltenen Widgets (Schaltfläche und Linienbearbeitung).Die beiden Widgets überschreiben das paintEvent, zeichnen nur dann einen eigenen (halbtransparenten) Hintergrund, wenn sie den Fokus haben, und verwenden keine Rahmen, die bereits von Qt bereitgestellt wurden. Der weiße Rand im zweiten Screenshot wird also in meinem benutzerdefinierten paintEvent gezeichnet.Ich möchte, dass der Hintergrund und die Zusammensetzung von Overlay-Widgets separat implementiert werden können. Der Hintergrund ist einAbstractMapView Das hat einige konkrete Kartenansichtsklassen. Das ganze Fenster ist einAbstractView (es gibt auch mehrere konkrete Ansichten), die sowohl eine konkrete Kartenansicht als auch die Overlay-Widgets enthalten, die auf eine Weise zusammengestellt werden, die selbst bestimmt wird. Daher möchte ich nicht, dass die Logik der Overlay-Widgets Teil der zugrunde liegenden Kartenansicht ist. (Ich hoffe, Sie haben das verstanden, da es etwas kompliziert ist.)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage