Как знают пользователи Qt, использование любых расширений OpenGL может быть довольно проблематичным. Я сделал так, чтобы он расширял класс QGLFunctions следующим образом:
class Object3D : protected QGLFunctions{
...
}
Чтобы Object3D функционировал правильно, чтобы он мог вызывать такие функции, как glGenBuffer () и т. Д., Необходимо вызвать
initializeGLFunctions(glWidget->context());
ПОСЛЕ QGLWidget был создан, иначе он просто завершит работу приложения, когда оно использует какие-либо функции расширения. Хотя я, наконец, могу вызывать «glGenBuffer ()» и другие во время существования Object3D, похоже, что происходит сбой при вызове ~ Object3D (), который содержит вызов «glDeleteBuffer ()». Я уверен, что именно этот вызов вызывает сбой приложения.
Кто-нибудь знает, как решить эту проблему? Я подозреваю, что это потому, что QGLWidget удаляется первым перед Object3D, и поэтому контекст QGLWidget исчез. Если это так, как я могу убедиться, что QGLWidget удален последним, поскольку QGLWidget добавлен в QMainWindow, который просто удаляет его дочерние элементы в порядке их добавления?
Общее правило, если вы не можете гарантия что объект OpenGL RAII будет уничтожен, пока контекст еще существует, тогда не помещайте объекты OpenGL в классы RAII C ++. Управляйте временем жизни объектов OpenGL другими способами.
Это ваш код (который вы забыли показать нам); Только вы можете решить, где или как управлять уничтожением классов. Вам нужна какая-то система для управления вашими объектами, которая будет гарантировать, что вещи будут уничтожены (и созданы) в правильном порядке.
Других решений пока нет …