调试时的确切崩溃是:
下级因为引发了异常而停止了。 在线程0中停止:0x7fed96c6cda处的异常,代码:0x0000005:读取访问冲突位于:0x0,flags = 0x0。
然后异常指向以下代码中的这一行:
if(QOpenGLContext::currentContext()->isValid())
以下代码足以为我重现异常。 在尝试访问上下文之前,对QOpenGLWidget类进行子类化并使子类调用initializeGL()一次并不能解决问题。
#include <QApplication>
#include <QOpenGLWidget>
#include <QOpenGLContext>
#include <QDebug>
void initialize(QOpenGLWidget * renderArea)
{
renderArea->makeCurrent();
if(QOpenGLContext::currentContext()->isValid())
{
qInfo() << "Valid.";
}
}
int main(int argc, char *argv[])
{
QSurfaceFormat format;
format.setVersion(3,3);
format.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(format);
QApplication a(argc, argv);
QOpenGLWidget * glw = new QOpenGLWidget;
initialize(glw);
return a.exec();
}
答案 0 :(得分:3)
我现在意识到答案:你必须在事件循环开始后进行所有这样的opengl初始化。
一个固定代码,其中&#34; MainWindow&#34; class在接收信号时执行所有opengl初始化&#34; onEventLoopStarted&#34;:
#include "mainwindow.h"
#include <QApplication>
#include <QOpenGLWidget>
#include <QOpenGLContext>
#include <QDebug>
#include <QTimer>
int main(int argc, char *argv[])
{
QSurfaceFormat format;
format.setVersion(3,3);
format.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(format);
QApplication a(argc, argv);
MainWindow w;
w.resize(512, 512);
w.show();
QTimer::singleShot(0, &w, SLOT(onEventLoopStarted()));
return a.exec();
//Window receives event and begins to initialize.
}