Почему Пока l oop внутри QT l oop не блокирует QT GUI - PullRequest
0 голосов
/ 16 февраля 2020

Я использую GLFW вместе с QT для приложения opengl.

У меня есть время l oop внутри основной функции.

Почему в то время как l oop не блокирует QT GUI?

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    cont.SetName("RootItem");
    TreeModel* model = new TreeModel("RootElement", &cont);
    WavefrontRenderer w(model);
    w.show();
    glfwInit();
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    glfwWindowHint(GLFW_SAMPLES, 4);
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Renderer", nullptr, nullptr);   // 
    glfwMakeContextCurrent(window);
    GLenum GlewInitResult;
    glewExperimental = GL_TRUE;
    GlewInitResult = glewInit();

    w.InitData();

    while (!glfwWindowShouldClose(window))
    {
        glClearColor(0.0, 0.3, 0.3, 0.0);
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
        w.render();     
        glfwPollEvents();
        glfwSwapBuffers(window);
    }
    // glfw: terminate, clearing all previously allocated GLFW resources.
    // ------------------------------------------------------------------
    glfwTerminate();
    //return 0;

    return a.exec();

}

Ответы [ 3 ]

1 голос
/ 16 февраля 2020

Кажется, что glfwPollEvents действует достаточно похоже на QApplication::exec, так что (некоторые) события обрабатываются должным образом.
Они, вероятно, оба вызывают DispatchMessage ( см. ), что затем позволяет зарегистрированному обратному вызову для окна обрабатывать событие.
Но может также случиться, что оба будут вести дополнительную бухгалтерию, которая может полагаться на эту склонную к ошибке.

1 голос
/ 16 февраля 2020

Вы вообще не используете насос событий QApplication, вы замкнули короткое замыкание на событие библиотеки Moodle \ glfw \ Wavefront l oop.

Поддержка OpenGl в Qt через QOpenGLWidget напрямую работает с paintGL метод, который должен выполнять весь рендеринг и который вызывается из события l oop. Если вы не используете это, вам придется каким-то образом объединить два потока, что проблематично c, так как и конвейер OpenGL, и Qt main l oop на некоторых платформах ограничены для использования ТОЛЬКО в основном потоке.

0 голосов
/ 16 февраля 2020

вы даже не запускаете событие приложения Qt l oop, потому что вы не вызываете a.exe c (), поскольку ваш код находится на стороне l oop. Я не эксперт по opengl, но я думаю, что вы видите окно, отображаемое самим opengl, а не gl canvas внутри окна приложения qt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...