QMainWindow 菜单栏:OpenGL 触发函数导致 GL 上下文问题
Posted
技术标签:
【中文标题】QMainWindow 菜单栏:OpenGL 触发函数导致 GL 上下文问题【英文标题】:QMainWindow menu bar : OpenGL triggered function causes GL context issue 【发布时间】:2016-04-06 13:15:07 【问题描述】:我有一个 QGLWidget 作为我的 QMainWindow 的中心小部件。它初始化 GL 上下文并在其paintGl 函数中进行绘制调用。在 QMainWindow 的菜单栏中,我有一个导入文件按钮,该按钮触发一个函数,该函数仅在 QGLWidget 使用 initializeGL 函数完成时运行。这个导入文件按钮调用应该将 3d 对象的顶点传输到 GL 缓冲区,这似乎工作正常。
但是,当 QGLWidget 调用它的绘制函数时,我收到一个错误的访问错误,并在调试模式下打开了以下行:
Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));
d_ptr->DrawArrays(mode, first, count); //exc_bad_access
如果我不是从菜单中的导入文件按钮而是直接从 QGLWidget 的 initializeGl 函数触发我的文件导入功能,那么一切都很好。
可能是什么问题?如果您需要更多信息,请告诉我。
【问题讨论】:
【参考方案1】:我发现了,
每次paint函数或initializeGL函数运行时,它们都会自动调用makeCurrent()函数来使QGLWidget的gl contex在当前线程中处于当前状态。即使 QMainWindow 与 QGLWidget 在同一线程中运行,绕过 QGLWidget 类并因此省略 makeCurrent() 函数会导致我的“文件导入”函数中的 OpenGl 函数在与 QGLWidget 不同的上下文(或空上下文)下运行。
【讨论】:
以上是关于QMainWindow 菜单栏:OpenGL 触发函数导致 GL 上下文问题的主要内容,如果未能解决你的问题,请参考以下文章
PyQt5学习记录---QMainWindow菜单栏状态栏和工具栏