Półprzezroczysty QWidget nad QGLWidget: Dziwne wyniki

Mam pełny rozmiar QGLWidget, który maluje tło aplikacji za pomocą QPainter (może się zmienić na natywne polecenia OpenGL w przyszłości).

Oprócz tego QGLWidget używam QWidgets (non-GL) dla elementów interfejsu użytkownika. Są to na przykład QLineEdits i QPushButtons. Umieszczam je w niestandardowym malowanym QWidget, który używa półprzezroczystego malowania tła. PaintEvents z QLineEdit i QPushButton są nadpisywane i używają również półprzezroczystego tła.

Cały interfejs użytkownikapowinien wyglądać jak poniżej (Jest to zrzut ekranu, w którym wyłączyłem OpenGL i użyłem QWidget zamiast QGLWidget dla tła. Zwróć uwagę na półprzezroczysty górny pasek, który również rysuje cień (w obrębie swojego regionu)):

Gdy QLineEdit ma fokus, powinien mieć większą nieprzezroczystość, ale wciąż nie w pełni nieprzezroczysty:

Więc teraz, przy włączonym OpenGL (tło jest wtedy QGLWidget), półprzezroczyste widgety powyżej nie malują na górze tła, ale na (wydaje się) niezainicjowanych danych. Obraz świecący przez górny pasek to czasami całe okno, a czasami inne okna znajdujące się obecnie na moim pulpicie.

Obecnie wygląda to następująco (Na tym zrzucie ekranu dane, na których malowane są półprzezroczyste operacje malowania, wydają się być obrazem samego widżetu z przesunięciem.):

Kiedy pisałem tekst do edycji wiersza (tutaj: „To jest jakiś tekst, który był wcześniej!”), Usunięto go i ustawiono fokus z powrotem na widżet tła (aby pojawiła się ikona lupy i tekst zastępczy), poprzednio malowane rzeczy wciąż świecą (zauważ, że widoczna granica powinnanie być już widocznym, ale także wciąż świeci):

Problem polega na tym, że zamiast malować na wierzchu widżetów, półprzezroczysty widżet jest malowany na wierzchustare wyniki, początkowo coś w rodzaju „niezainicjowanej pamięci”.

Dlaczego to się dzieje? Jak mogę rozwiązać problem?

Rzeczy, o których powinieneś wiedzieć przed udzieleniem odpowiedzi:

Scena tła to kompozycja kafelków, które są renderowane poza ekranem. Można go więc malować bardzo szybko, a malowanie tła dla każdej małej zmiany nakładki nie jest problematyczne.Górny pasek to niestandardowy widget QWidget z ręcznym malowaniem i układem dwóch widżetów (edycja przycisku i linii).Dwa widgety zastępują paintEvent, rysują tylko własne (półprzezroczyste) tło, gdy mają fokus i nie używają ramek już dostarczonych przez Qt. Biała ramka na drugim zrzucie jest rysowana w moim niestandardowym paintEvent.Chcę, aby tło i kompozycja widgetów nakładek były oddzielnie implementowane. Tło jestAbstractMapView który ma konkretne klasy widoku mapy. Całe okno toAbstractView (istnieje również wiele konkretnych widoków), który zawiera zarówno konkretny widok mapy, jak i widżety nakładki, które w określony sposób same się decydują. Dlatego nie chcę, aby logika widgetów nakładki była częścią podstawowego widoku mapy. (Mam nadzieję, że to zrozumiałeś, ponieważ jest to trochę skomplikowane.)

questionAnswers(2)

yourAnswerToTheQuestion