gpt4 book ai didi

c++ - OpenGL 3.0 不能在 Windows 上使用 Qt

转载 作者:行者123 更新时间:2023-11-28 05:14:08 27 4
gpt4 key购买 nike

我正在 Windows 上开发一个大量使用 OpenGL 的 Qt 项目。它最初配置为使用 OpenGL 2.1 版,一切正常。最近把代码中的OpenGL版本升级到了3.0。现在,项目在初始化期间很早就崩溃了,并出现以下错误:

QML debugging is enabled. Only use this in a safe environment.
ASSERT: "qGuiApp" in file kernel\qopenglcontext.cpp, line 1238
Debug Error!

Program: C:\Qt\5.7\msvc2015_64\bin\Qt5Cored.dll
Module: 5.7.0
File: global\qglobal.cpp
Line: 3063

ASSERT: "qGuiApp" in file kernel\qopenglcontext.cpp, line 1238

...这是调试器停止的行:

if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) {

在 global.cpp 中,它在此 block 的末尾失败。具体来说,错误信息中给出的行号对应#endif行:

#ifndef QT_NO_EXCEPTIONS
/*
\internal
Allows you to call std::terminate() without including <exception>.
Called internally from QT_TERMINATE_ON_EXCEPTION
*/
Q_NORETURN void qTerminate() Q_DECL_NOTHROW
{
std::terminate();
}
#endif

查看 qopenglcontext.cpp,第 1238 行实际上位于一个大注释 block 中。这是紧随其后的代码,根据上面的错误消息(Q_ASSERT(qGuiApp) 行)几乎可以肯定是正确的位置:

QOpenGLContext::OpenGLModuleType QOpenGLContext::openGLModuleType()
{
#if defined(QT_OPENGL_DYNAMIC)
Q_ASSERT(qGuiApp);
return QGuiApplicationPrivate::instance()->platformIntegration()->openGLModuleType();
#elif defined(QT_OPENGL_ES_2)
return LibGLES;
#else
return LibGL;
#endif
}

请记住,这些是标准的 Qt 文件,这是我从未接触过的代码。

以下是我迄今为止尝试过的内容的总结。当然,这些都不起作用:

  • 尝试设置我的环境变量,如下页所示:http://doc.qt.io/qt-5/windows-requirements.html .具体来说,我将我的 QT_OPENGL var 设置为桌面、角度,然后是软件,但没有任何效果。
  • 正如同一页所建议的那样,我尝试将以下行添加到我的 .pro 文件中:“LIBS += opengl32.lib”和“LIBS += -lopengl32”(我添加了一行,对其进行了测试,将其删除,然后添加了第二行。)
  • 尝试取消设置 QT_OPENGL_DYNAMIC 变量。
  • 已下载并运行 OpenGL Extensions Viewer 4.1 并确认我的 OpenGL 存在并且设置正常。渲染测试功能证明 OpenGL 在我的系统上正常工作。
  • 还成功运行了 Qt 内置的 HelloWorld OpenGL 示例。这运行良好,确认 Qt 能够以其他方式运行 OpenGL。

我在这里没有想法。欢迎任何建议或知识。另外,如果您需要更多信息,请询问,我会及时回复。

编辑:这是主要部分的开头:

int main(int argc, char* argv[]) 
{
// setup OpenGL before application initialization
GLFunctions::setupOpenGL();
QApplication app(argc, argv);
....
}

这里是设置函数:

static void setupOpenGL()
{
QSurfaceFormat fmt;
fmt.setDepthBufferSize( 24 );
if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL)
{
fmt.setVersion(3, 3);
fmt.setProfile(QSurfaceFormat::CoreProfile);
//fmt.setRenderableType(QSurfaceFormat::OpenGL);
}
else
{
fmt.setVersion(3, 0);
}
}

最佳答案

来自 the documentation QOpenGLContext::openGLModuleType() 的:

Note: This function requires that the QGuiApplication instance is already created.

无论 openGLModuleType 是什么,您都可以设置您想要的版本(取消勾选),稍后检查您是否获得了您请求的版本。

关于c++ - OpenGL 3.0 不能在 Windows 上使用 Qt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42989078/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com