QGLWidget для графики и QT для GUI - PullRequest
5 голосов
/ 30 декабря 2011

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

Некоторые утверждают, что QGLWidget не может иметь QWidget в качестве детей ... Я не уверен в этом и не хочу сдаваться. Кстати, я использую библиотеку визуализации для рисования сцены OpenGL, но это всего лишь оболочка OpenGL ...

Любые подсказки, где проблема может быть? Кроме того, ключевые события перестают обрабатываться по некоторым причинам, когда я добавляю подвиджеты в GQLWidget.

Обновление: Я пробовал различные комбинации виджетов и макетов. Кажется, что QGLWidget просто рисуется поверх чего-либо. Я даже пытался с помощью метода повысить () упорядочить Z-глубину виджетов, но безрезультатно. Является ли overlayGL () единственным способом рисования поверх виджета OpenGL?

Обновление 2 После нескольких месяцев попыток я понял, что это связано с QT. Всякий раз, когда QGLWidget рисуется поверх другого QGLWidget, первая функция background () не вызывается. Таким образом, кнопка есть и может быть нажата, но она не нарисована. Мой обходной путь должен был нарисовать все сам, используя QPainter - это работает. Что мне показалось любопытным, так это то, что нужно использовать QPainter :: startNativePainting (), чтобы рисовать с ним. Можно было бы ожидать, что они перегрузят start () в QPainter для вызова startNativePainting () всякий раз, когда QGLWidget является устройством рисования ...

Другой (возможно, полезный) факт заключается в том, что QPainter вызывает CHANGE контекст Opengl. Так что, если у вас есть другой инструмент в сотрудничестве с QPainter (в моем случае библиотека визуализаций), есть вероятность, что один из них потерпит крах (в моем случае VL, который проверяет, очищено ли состояние контекста перед каждым кадром).

Ответы [ 4 ]

2 голосов
/ 31 декабря 2011

Есть лабораторный пример рендеринга Qt виджетов с использованием opengl он немного стар, и я не пробовал его с улучшенным qglwidget в 4.8

Есть также проблема с рисованиемповерх полноэкранного QGLwidget - предположительно это была ошибка в драйвере NVidia openGL.Кажется, он не был решен https://bugreports.qt -project.org / browse / QTBUG-7556

1 голос
/ 01 января 2012

На вашем месте я бы использовал QGLWidget в качестве области просмотра для QGraphicsScene, тогда вы можете рисовать свои виджеты с помощью QGraphicsProxyWidget. Таким образом, вы получите правильный видовой экран OpenGL с возможностью вставлять виджеты и легко ими манипулировать.

0 голосов
/ 10 октября 2015

Это старый вопрос, но недавно у меня было немало проблем с этим, и это то, что мне помогло -

Использование QML / QT Quick.QML - это язык, похожий на javascript, который позволяет вам размещать элементы виджета в окне и выполнять базовую обработку событий, таких как щелчки мыши.Есть еще несколько интересных функций, но наиболее актуальным для этого вопроса является то, что вы можете импортировать виджеты qt из кода C ++.

Таким образом, вы можете создать собственный QGLWidget, импортировать его в окно QML,и очень легко установить виджеты размера / положения / стикера поверх него.Пример QT Scenegraph отлично объясняет это.Код Scenegraph также включен в качестве примера, по крайней мере, в Qt Creator 3.2.1 с открытым исходным кодом (это версия, которую я имею в любом случае)

0 голосов
/ 30 декабря 2011

Вы пытались вызвать update () явно? Я нахожу, что иногда QGLWidget медленно обновляет содержимое экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...