正如Qt用户所知,使用任何OpenGL扩展都会非常麻烦。我的工作方式是扩展QGLFunctions类,如下所示:
class Object3D : protected QGLFunctions{
...
}
为了让Object3D正常运行,它可以调用像glGenBuffer()等函数,需要调用
initializeGLFunctions(glWidget->context());
创建QGLWidget之后,否则它会在使用任何扩展功能时使应用程序崩溃。虽然我最终可以在Object3D存在期间调用“glGenBuffer()”和其他人,但它似乎会在包含“glDeleteBuffer()”调用的~Object3D()调用时崩溃。我确信这是使应用程序崩溃的调用。
任何人都知道如何解决这个问题?我怀疑这是因为QGLWidget在Object3D之前被删除,因此QGLWidget的上下文消失了。如果是这种情况,我怎样才能确保QGLWidget最后被删除,因为QGLWidget被添加到QMainWindow,它只是按照添加的顺序删除它的子节点?
答案 0 :(得分:2)
一般规则是,如果你不能保证在上下文仍然存在时将销毁OpenGL RAII对象,那么不要将OpenGL对象包装在RAII C ++类中。以其他方式管理OpenGL对象的生命周期。
这是你的代码(你忽略了向我们展示);只有你可以决定在哪里或如何管理类的销毁。您需要一些系统来管理您的对象,以确保以正确的顺序销毁(和创建)事物。