Qt QOpenGLWidget сбой при вызове glewInit () с ошибкой: отсутствует версия GL - PullRequest
0 голосов
/ 11 апреля 2019

Я использую Qt для создания 3D-программы с GLEW. У меня проблема, когда я вызываю glewInit () из Widget создания во время выполнения. Я создаю унаследованный класс MyRender на основе QOpenGLWidget . Затем реализовано initializeGL () с

GLenum err;
if( err = glewInit() )
{
    printf( "error because: %s\n", glewGetErrorString( err )  );
    exit(123);
}

Обычно я использую класс MyRender через Qt Designer и продвигаю QOpenGLWidget до MyRender . Тогда у меня будет MyRender Object с момента запуска программы. Нет проблем.

Однако, когда я создаю MyRender во время выполнения. Например;

MyRender * myrender = new MyRender ( this );

Сбой программы при вызове glewInit ()

Missing GL version   // glewInit() problem

Я нашел людей, у которых такая же проблема, как и у меня, из этого

Однако в посте люди используют GLUT или SDL для создания контекста. Поскольку я использую только GLEW, как я могу сделать контекст из QOpenglWidget таким же образом, как

glutInitDisplayMode(GLUT_RGB); //use GLUT 

или

sf::Window   App(sf::VideoMode(400, 400, 32), "Window"); //use SDL 

или

glfwMakeContextCurrent    // use glfw

Так как я не использую ни один из них. Я использую только QOpenGLWidget и glew. Я пробовал с

myrender->makeCurrent(); // fail
myrender->initializeGL(); // fail

перед звонком

glewInit()

однако, проблема все еще сохраняется.

О моей машине: я использую Windows 10 64-bit. Qt 5.11 GLEW 2.1.0

EDIT:

Я проверяю свой код с

 void initializeGL()
 {
        echo("inside initializeGL");

        QOpenGLContext* current = this->context();
        if( current == nullptr )
        {
            printf("current context is null\n");
            exit(123);
        }
        else
        {
           printf("current context is good\n");
        }

        GLenum err = glewInit();  // error here
        ...
 }

Если я использую Qt Designer для продвижения openGLWidget на MyRender . контекст будет в порядке; Однако, если я создаю MyRender во время выполнения

MyRender* myrender = new MyRender( this );

Контекст будет нулевым и приведет glewInit () к ошибке.

1 Ответ

0 голосов
/ 11 апреля 2019

Я обнаружил, что проблема заключается в том, что контекст не создается, и когда программа вызывает функцию initializeGL ().Решение, которое я сделал, я вызываю show () ;сразу после создания виджета.

myrender = new MyRender( ui->mdiArea );
myrender->show(); // this line make the context for QOpenGLWidget I think..

... 
// note class MyRender is an inherited class from QOpenGLWidget
...