不能使用外部QOpenGLWidget制作的上下文?

时间:2017-01-07 20:25:51

标签: c++ qt exception

调试时的确切崩溃是:

  

下级因为引发了异常而停止了。   在线程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();
}

1 个答案:

答案 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.
}