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

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

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

Весь пользовательский интерфейс должен выглядеть следующим образом(Это снимок экрана, на котором я отключил OpenGL и использовал QWidget вместо QGLWidget для фона. Обратите внимание на полупрозрачную -верхнюю полосу, которая также рисует тень (в своей области )):

Screenshot

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

Screenshot

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

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

Screenshot

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

Screenshot

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

Почему это происходит? Как я могу решить проблему?

Что нужно знать, прежде чем отвечать:

  • Фоновая сцена представляет собой композицию плиток, отображаемых за пределами -экрана. Таким образом, его можно рисовать очень быстро, и перекрашивание фона для каждого небольшого изменения наложения не проблематично.
  • Верхняя панель представляет собой настраиваемый QWidget с ручной прорисовкой и расположением содержащихся двух виджетов (кнопки и редактирования строки ).
  • Два виджета перезаписывают событие paintEvent, рисуют свой собственный (полу-прозрачный )фон только тогда, когда они имеют фокус, и не используют кадры, уже предоставленные Qt. Итак, белая рамка на втором снимке экрана нарисована в моем пользовательском PaintEvent.
  • Я хочу, чтобы фон и состав оверлейных виджетов можно было реализовать отдельно. Фон представляет собой AbstractMapView, который имеет несколько конкретных классов представления карты. Все окно представляет собойAbstractView(также есть несколько конкретных представлений ), которые содержат как конкретное представление карты, так и виджеты наложения, составленные так, как решает само решение. Поэтому я не хочу, чтобы логика виджетов наложения была частью базового представления карты. (Надеюсь, вы поняли это, так как это немного сложно.)
7
задан leemes 22 July 2012 в 21:18
поделиться