QOpenGLWidget с QApplication?

У нас есть приложение на основе QWidget, которое ранее использовало QWindow для рендеринга OpenGL. Чтобы вписать это окно в наше приложение, мы должны были использовать

QWidget QWidget::createWindowContainer(QWindow);

Ранее для рендеринга мы использовали только внешние библиотеки Qt OpenGL.

У нас есть желание перейти от использования QWindow к какому-то QWidget для совместимости с сенсорными жестами и, как правило, для лучшей общей совместимости с остальной частью нашего приложения. Последним рекомендованным OpenGL-совместимым QWidget является QOpenGLWidget, поэтому мы пытаемся это использовать.

glContext это OpenGLContext, которым мы управляем сами.

Проблема в том, что QOpenGLWidget не является QSurface, поэтому я не могу вызвать

glContext->makeCurrent(this);

чтобы сделать контекст актуальным для моего пользовательского QOpenGLWidget, как мы могли бы сделать это раньше с помощью нашего пользовательского QWindow и нашего собственного OpenGLContext.

Если я попытаюсь использовать QOpenGLWidget::makeCurrent(); затем он использует неправильный контекст и пытается что-то сделать с каким-то магическим контекстом, обработанным QT, или чем-то, чего я не понимаю.

В результате после создания нашего OpenGLContext, когда мы пытаемся вызвать

glFunctions = glContext->versionFunctions<QOpenGLFunctions_3_3_Core>();
if(!glFunctions->initializeOpenGLFunctions())
printf("Could not initialize OpenGL functions.");

Всегда не удается инициализировать функции OpenGL.

Я перечитывал все другие ресурсы, которые я могу найти по этой теме, и наткнулся на этот старый вопрос переполнения стека, который был похож:
QOpenGLWidget с общим контекстом OpenGL?

Ответ на этот вопрос не решил мою проблему, потому что мы используем QApplication, а не QGuiApplication, так как это приложение на основе QWidget.
QGuiApplicationPrivate::init() никогда не вызывается и QOpenGLContext::globalShareContext() возвращает нулевой указатель, так как он не инициализирован.

К сожалению, я не могу ждать QOpenGLWidget::initializeGL() вызываться для инициализации управляемого QT OpenGLContext так как у нас уже есть много ресурсов OpenGL по различным классам, которые попытка чтобы получить инициализацию до этого.

Кто-нибудь еще сталкивался с такой же проблемой?

Какие-либо предложения?

3

Решение

Я делаю небольшую работу по догадкам здесь.

Возможно, ваш OpenGL по умолчанию равен ANGLE.
А ваши предыдущие вызовы OpenGL для приложений являются API-интерфейсом OpenGL для конкретной платформы.

попробуйте установить ниже атрибут для вашего QApplication объект.

appObject->setAttribute(Qt::AA_UseDesktopOpenGL, true);

тогда попробуй позвонить

QOpenGLWidget::makeCurrent();

Если что-то все еще не работает, настройте библиотеки QT для настольного OpenGL.

configure -opengl desktop

ссылка ниже дает вам некоторую информацию о подходе Qt к OpenGL.
http://doc.qt.io/qt-5/windows-requirements.html

Оставьте в комментариях, если это вам не поможет, удалите ответ.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]