Russian Qt Forum
Октябрь 01, 2024, 18:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема отрисовки QDialog поверх QGLWidget  (Прочитано 2807 раз)
vulko
Гость
« : Март 06, 2014, 15:59 »

После того как было решено заменить рисование на канве, рисованием средствами opengl, возникли проблемы с отрисовкой диалогов который поверх основного виджета.

Что есть:
QGLWidget с динамической 2D сценой, обновляемой раз в 10ms... в общем очень часто.

Несколько классов, наследуемых от QDialog - виджеты которые всегда сверху.
Все что наследуется от QDialog, отрисовывается кастомно (через paintEvent). Фон этих виджетов рисуется полупрозрачным.
Также для них выставляется несколько опций:
Код:
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);

Т.к. Qt::FramelessWindowHint не позволяет передвигать диалоги (точнее то что от них наследуется...), обрабатываются mouseEvent'ы и реализована возможность перетаскивать эти виджеты, считая изменение координат мышки (при зажатой кнопке) и вызова наследуемого от QWidget метода move(x, y).

Проблема заключается в том, что при перетаскивании этих виджетов по экрану, случается полный ппц с их фоном (похожий эффект при подвисании наблюдается обычно - следы от окон в них появляются и т.п...). Также эти перетаскиваемые диалоги начинают "следить" на других виджетах (которые статичны, но также наследуются от qdialog и рисуются кастомно в paintEvent'е).

Если задать setAttribute(Qt::WA_OpaquePaintEvent), то все вроде ок, т.к. заставляет их перерисовываться полностью при каждом paintEvent...


Однако остается 2 проблемы...
1) После перехода на OpenGL (вместо рисования на канве), фон у этих перетаскиваемых виджетов перестал быть прозрачным по отношению к OpenGL'ной сцене, но остался прозрачным по отношению к черному цвету, который по совместительству является glClearColor'ом...
2)Даже после WA_OpaquePaintEvent все равно эти dragable виджеты один хрен друг на друге следят и на других недвигаемых виджетах...

Собсно как побороть эти проблемы?

П.с. может тут нужно QGraphicsScene использовать? Или ещё что-то?
Для наглядности приложил скрин (внизу QGLWidget, панель слева и окошечки это QDialog).
Записан
vulko
Гость
« Ответ #1 : Март 11, 2014, 14:57 »

Судя по отсутствию ответов, возможно кому-то пригодится моё решение проблемы...

Причина такого поведения видимо заключается в том что у QGLWidget'а свой личный контекст, который не позволяет пересекаться в плане прозрачности с другими виджетами...

Заморачиваться с overlay'ем для QGLWidget'а и тем более с использованием одного контекста (что кстати нельзя сделать через стандартные внешние апи) желания не было никакого, поэтому пришлось воспользоваться аналогичным в boxes example подходом, а именно QGraphicsScene и QGraphicsView. В принципе у графической сцены есть методы drawBackground и drawForeground, которые позволяют рисовать посредствам OpenGL.

Ну а виджеты вставляются непосредственно в сцену. Прозрачность поддерживается, проблем с отрисовкой нет.
Подход конечно крайне кривой, но как я понял разработчики QT не любят простых решений Улыбающийся))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 20.