Полупрозрачный QWidget поверх QGLWidget: странные результаты

У меня есть полноразмерный QGLWidget, который рисует фон приложения, используя QPainter (может измениться на родные команды openGL в будущем).

Поверх этого QGLWidget я использую QWidgets (не-GL) для элементов пользовательского интерфейса. Это, например, QLineEdits и QPushButtons. Я поместил их в нарисованный на заказ QWidget, который использует полупрозрачный фоновый рисунок. PaintEvents QLineEdit и QPushButton перезаписываются и также используют полупрозрачный фон.

Весь интерфейсshould look like the following (Это скриншот, где я отключил OpenGL и использовал QWidget вместо QGLWidget для фона. Обратите внимание на полупрозрачную верхнюю панель, которая также рисует тень (в пределах своей собственной области)):

Screenshot

Когда QLineEdit имеет фокус, он должен иметь более высокую непрозрачность, но все еще не полностью непрозрачный:

Screenshot

Так что теперь, с включенным OpenGL (тогда фон является QGLWidget), полупрозрачные виджеты над не рисуют поверх фона, а на (кажется, что) неинициализированных данных. Изображение, просвечивающее через верхнюю панель, иногда само окно, а иногда и другие окна, которые в настоящее время находятся на моем рабочем столе.

This currently looks like the following (На этом снимке экрана данные, на которых рисуются полупрозрачные операции рисования, представляются изображением самого виджета со смещением.):

Screenshot

Когда я написал текст в строку редактирования (здесь: & quot; Это какой-то текст, который был там раньше! & Quot;), удалил его и снова установил фокус на виджете фона (чтобы появился значок лупы и текст заполнителя) ранее окрашенные вещи все еще просвечивают (обратите внимание, что видимая граница должнаnot быть видимым больше, но также все еще просвечивает)

Screenshot

Итак, проблема в том, что вместо того, чтобы рисовать поверх базовых виджетов, полупрозрачный виджет рисуется поверхold resultsизначально обозначается как «неинициализированная память».

Why does this happen? How can I solve the problem?

Вещи, которые вы должны знать, прежде чем ответить:

The background scene is a composition of tiles which are rendered off-screen. So it can be painted very fast and repainting of the background for every little change of the overlay isn't problematic. The top bar is a custom QWidget with manual painting and arrangement of the contained two widgets (the button and line edit). The two widgets overwrite the paintEvent, only draw their own (semi-transparent) background when they have focus and don't use frames already provided by Qt. So the white border in the second screenshot is drawn in my custom paintEvent. I want the background and the composition of overlay widgets to be separately implementable. The background is an AbstractMapView which has some concrete map view classes. The whole window is an AbstractView (there are multiple concrete views, too), which contains both a concrete map view and the overlay widgets, composed in a way itself decides. Therefore, I don't want the logic of the overlay widgets to be part of the underlying map view. (I hope you understood this, as it is a bit complicated.)

Ответы на вопрос(2)

Ваш ответ на вопрос