2011-12-30 2 views
5

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

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

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

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

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

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

+0

Не можете ли вы создать не-GL-виджет в качестве главного окна, а виджет GL как его дочерний ? Таким образом, другие элементы управления, которые вы хотите в своем окне, будут братьями и сестрами из окна GL, а не детьми. –

+0

Я пробовал это первым - он не жалуется на некоторые проблемы с GL_SRC_ALPHA. QGLWidget построен по VL [link] (http://www.visualizationlibrary.org/) и очень сложный и, следовательно, трудно отлаживать ... –

+0

Вы пытаетесь создать объекты QWidget, всплывающие поверх QGLWidget? – cmannett85

ответ

2

Существует пример лаборатории рендеринга Qt widgets using opengl это немного старое, и я не пробовал с улучшенной QGLWidget в 4,8

Существует также проблема с нанесением поверх полноэкранного QGLWidget - это было предположительно, ошибка в драйвере NVIDIA openGL. Это, кажется, не было решено https://bugreports.qt-project.org/browse/QTBUG-7556

0

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

+0

Да, QGLWidgets вызывают явно update(). Я подозреваю, что что-то с порядком рисования неверно, но я не знаю, как QT обрабатывает чертеж виджета и как он может/должен влиять ... –

+0

Не могли бы вы использовать некоторые простые функции opengl для рисования некоторой базовой геометрии, например сферы или заварочный чайник? Просто убедитесь, что QGLWidget правильно рисует какой-то материал. Если это работает, значит, есть некоторые ошибки в используемой вами библиотеке. – NullSpace

+0

Проблема не в том, что сцена openGL не нарисована. Проблема в том, что она нарисована ** сверху ** обычных QWidgets. –

1

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

+0

Я тоже пробовал, это работает, но не с моим сценарием. Я передал свой QGLWidget как окно просмотра в GGraphicsView (который отображает мою QGraphicsScene), но он не с ошибкой (по существу, QGraphicsScene жалуется, что GLContext имеет значение null). Я думаю, что это связано с тем, что у моего QGLWidget есть собственный контекст ... –

+0

Может быть, для поддержки OpenGL Qt требуется, чего у вас нет. Можете ли вы опубликовать свой код QGLContext и какую версию OpenGL вы используете? – cmannett85

+0

'QGLContext * glctx = new QGLContext (context() -> format(), this); QGLFormat fmt = context() -> format(); // установка различных мараметров формата в fmt glctx-> setFormat (fmt); glctx-> create (shareContext); setContext (glctx); ' –

0

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

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

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

Смежные вопросы