QMainWindow菜单栏:OpenGL触发的功能导致GL上下文问题

QMainWindow menu bar : OpenGL triggered function causes GL context issue

本文关键字:GL 上下文 问题 功能 菜单栏 OpenGL QMainWindow      更新时间:2023-10-16

我有一个QGLWidget作为QMainWindow的中心小部件。它初始化GL上下文,并在其paintGl函数中进行draw调用。在QMainWindow的菜单栏中,我有一个导入文件按钮,它触发一个函数,该函数只有在QGLWidget使用initializeGL函数完成时才运行。这个导入文件按钮调用应该将3d对象的顶点转移到GL缓冲区,这似乎很好。

然而,当QGLWidget调用其绘制函数时,我收到一个错误的访问错误,在调试模式下打开了以下行:

Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
d_ptr->DrawArrays(mode, first, count);     //exc_bad_access

如果我不是从菜单中的导入文件按钮而是直接从QGLWidget的initializeGl函数触发我的文件导入函数,那么一切都很好。

可能是什么问题?如果你需要进一步的信息,请告诉我。

我发现

每次paint函数或initializeGL函数运行时,它们都会自动调用makeCurrent()函数,使QGLWidget的gl上下文在当前线程中成为当前上下文。即使QMainWindow与QGLWidget在同一线程中运行,但绕过QGLWiget类并因此省略makeCurrent()函数会导致我的"文件导入"函数中的OpenGl函数在与QGLWidget不同的上下文(或空上下文)中运行。