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 上下文问题的主要内容,如果未能解决你的问题,请参考以下文章

Qt 向 QMainWindow 添加非菜单栏键盘快捷键

5.2.1 添加菜单栏

在QMainwindow在对菜单栏以及工具栏的操作

PyQt5学习记录---QMainWindow菜单栏状态栏和工具栏

放在 QMainWindow 的 Central Widget 中的 QTabWidget 拉伸太多并覆盖了菜单栏

PyQt5 学习记录005:QMainWindow 及状态栏菜单栏和工具栏