У нас есть приложение на основе 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 по различным классам, которые попытка чтобы получить инициализацию до этого.
Кто-нибудь еще сталкивался с такой же проблемой?
Какие-либо предложения?
Я делаю небольшую работу по догадкам здесь.
Возможно, ваш 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
Оставьте в комментариях, если это вам не поможет, удалите ответ.
Других решений пока нет …