Не можете использовать контекст, созданный внешним QOpenGLWidget?

Точный сбой при отладке:

Низший остановился, потому что вызвал исключение. Остановлен в потоке 0 из-за: исключения на 0x7fed96c6cda, код: 0x0000005: нарушение прав доступа на чтение: 0x0, flags=0x0.

Затем исключение указывает на эту строку в приведенном ниже коде:

if(QOpenGLContext::currentContext()->isValid())

Приведенного ниже кода достаточно, чтобы воспроизвести исключение для меня. Создание подкласса класса QOpenGLWidget и вызов инициализации GL() подкласса один раз перед попыткой доступа к контексту не решает проблему.

#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();
}

person user45681    schedule 07.01.2017    source источник


Ответы (1)


Теперь я понимаю ответ: вы должны выполнять всю такую ​​​​инициализацию opengl ПОСЛЕ запуска цикла событий.

Исправлен код, в котором класс «MainWindow» выполняет всю инициализацию opengl при получении сигнала «onEventLoopStarted»:

#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.
}
person user45681    schedule 07.01.2017
comment
15 минут — это время, прошедшее между вашим вопросом и вашим ответом. Тебе нужно было больше времени подумать о своей проблеме. - person nikau6; 08.01.2017
comment
На самом деле именно создание вопроса помогло мне понять это. Впрочем, вы, наверное, правы. - person user45681; 08.01.2017