无法在 InitializeGL 和 paintGL 之外调用 OpenGL 相关函数
Posted
技术标签:
【中文标题】无法在 InitializeGL 和 paintGL 之外调用 OpenGL 相关函数【英文标题】:Unable to call OpenGL related functions outside of InitializeGL and paintGL 【发布时间】:2015-07-05 03:40:15 【问题描述】:正如标题所示,在 Qt 内部,我无法使用或调用 QGLWidget 函数之外的任何 OpenGL 函数,例如 initializeGL()
和 paintGL()
。
在我的QMainWindow
类中的一个插槽被调用后,我正在尝试构建一个 3D 模型。一切似乎工作正常,所有顶点都已加载,但是,当我尝试绘制模型时,出现 NULL 引用异常;当提供的顶点太少时,通常会发生这种情况。
当我在initializeGL()
中使用它时,同样的构建功能也起作用。
【问题讨论】:
【参考方案1】:这实际上很简单:在这些函数之外,QGLWidget 的上下文不是当前的。您可以通过调用 QGLWidet::makeCurrent() 使上下文成为当前的。解决这个问题的更好方法是将调用任何 GL 函数推迟到 paintGL 中,因为这样可以确保上下文是当前的,并且您不会冒险通过更改上下文来弄乱任何其他 openGL 内容。
【讨论】:
非常感谢您,我真的很感激。我一直在寻找答案很长一段时间了!当您说最好在paintGL()
内做所有事情时,优势是什么?再次感谢!
嗯,有些Qt Widgets也使用GL来绘制。他们也会调用 make their context(s) current,所以这应该不是问题。我只是觉得这对我来说更有意义,我猜; GL 对象可能会被使用的唯一地方是在paintGL 中,那么为什么不在那里创建它们呢?最后,这取决于您如何设计应用程序。
哦!好吧,我明白了。我会考虑到这一点。再次感谢您的帮助。 :)
非常感谢,我在几个小时内一直在寻找这个问题,如果在 initializeGL 中创建我的对象画得很好,但如果在其他地方创建就不行。以上是关于无法在 InitializeGL 和 paintGL 之外调用 OpenGL 相关函数的主要内容,如果未能解决你的问题,请参考以下文章
如何让 qt 设计器自定义 QOpenGLWidget 小部件背景透明?