Название: Проблема отрисовки QDialog поверх QGLWidget Отправлено: vulko от Март 06, 2014, 15:59 После того как было решено заменить рисование на канве, рисованием средствами opengl, возникли проблемы с отрисовкой диалогов который поверх основного виджета.
Что есть: QGLWidget с динамической 2D сценой, обновляемой раз в 10ms... в общем очень часто. Несколько классов, наследуемых от QDialog - виджеты которые всегда сверху. Все что наследуется от QDialog, отрисовывается кастомно (через paintEvent). Фон этих виджетов рисуется полупрозрачным. Также для них выставляется несколько опций: Код: setWindowFlags(Qt::FramelessWindowHint); Т.к. 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). Название: Re: Проблема отрисовки QDialog поверх QGLWidget Отправлено: vulko от Март 11, 2014, 14:57 Судя по отсутствию ответов, возможно кому-то пригодится моё решение проблемы...
Причина такого поведения видимо заключается в том что у QGLWidget'а свой личный контекст, который не позволяет пересекаться в плане прозрачности с другими виджетами... Заморачиваться с overlay'ем для QGLWidget'а и тем более с использованием одного контекста (что кстати нельзя сделать через стандартные внешние апи) желания не было никакого, поэтому пришлось воспользоваться аналогичным в boxes example подходом, а именно QGraphicsScene и QGraphicsView. В принципе у графической сцены есть методы drawBackground и drawForeground, которые позволяют рисовать посредствам OpenGL. Ну а виджеты вставляются непосредственно в сцену. Прозрачность поддерживается, проблем с отрисовкой нет. Подход конечно крайне кривой, но как я понял разработчики QT не любят простых решений :))) |