为什么QT循环中的While循环没有阻塞QT-GUI

为什么QT循环中的While循环没有阻塞QT-GUI,qt,qt5,Qt,Qt5,我正在为opengl应用程序使用GLFW和QT 我在主函数中有一个while循环 为什么while循环没有阻塞QT-GUI int main(int argc, char *argv[]) { QApplication a(argc, argv); cont.SetName("RootItem"); TreeModel* model = new TreeModel("RootElement", &cont); WavefrontRenderer w(mod

我正在为opengl应用程序使用GLFW和QT

我在主函数中有一个while循环

为什么while循环没有阻塞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();

}

您甚至没有启动Qt应用程序事件循环,因为您没有调用a.exec(),因为您的代码在while循环的I端。
我不是opengl专家,但我猜您看到的窗口是opengl本身渲染的窗口,而不是qt应用程序窗口中的gl画布

您甚至没有启动Qt应用程序事件循环,因为您没有调用a.exec(),因为您的代码在while循环的I端。
我不是opengl专家,但我猜您看到的窗口是opengl本身渲染的窗口,而不是qt应用程序窗口中的gl画布

似乎
glfwPollEvents
的行为方式与
QApplication::exec
相似,因此(某些)事件得到了正确处理。
它们可能都调用
DispatchMessage
(),然后让窗口的注册回调处理事件。

但也有可能两者都做了额外的簿记工作,这可能会使依赖这种错误变得容易

似乎
glfwPollEvents
的行为方式与
QApplication::exec
相似,因此(某些)事件得到了正确处理。
它们可能都调用
DispatchMessage
(),然后让窗口的注册回调处理事件。

但也有可能两者都做了额外的簿记工作,这可能会使依赖这种错误变得容易

您根本没有使用QApplication事件泵,您对Moodle\glfw\Wavefront library事件循环短路


Qt的OpenGl支持通过
QOpenGLWidget
直接与
paintGL
方法一起工作,该方法应该执行所有渲染,并从事件循环内部调用。如果您不使用它,您将不得不以某种方式组合两个线程,这是一个问题,因为某些平台上的OpenGL管道和Qt主循环仅限于在主线程中使用。

您根本没有使用QApplication事件泵,您在Moodle\glfw\Wavefront library事件循环上短路



Qt的OpenGl支持通过
QOpenGLWidget
直接与
paintGL
方法一起工作,该方法应该执行所有渲染,并从事件循环内部调用。如果你不使用它,你将以某种方式组合两个线程,有些平台上的OpenGL pipeline和Qt main loop都被限制为只能在主线程中使用,这是一个问题。

是什么让你认为它没有阻止它呢?@Darklighter我可以自由地点击GUI的按钮,这些按钮会根据它们的信号和插槽来执行。我应该有一种冻结的感觉如果按钮被阻止,请尝试添加
QPushButton pb(“按”);pb.show()紧靠
之前,而(!glfwwindowshouldlclose(window))
。你能和按钮互动吗?是什么让你得出结论,它没有阻止它?@Darklighter我可以自由地点击GUI的按钮,这些按钮根据它们的信号和插槽执行。如果按钮被阻止,我应该会有一种冻结的感觉。
w.render()
do?尝试添加
QPushButton pb(“按下”);pb.show()紧靠
之前,而(!glfwwindowshouldlclose(window))
。你能与按钮交互吗?是的,这是我最初面临的问题。所有openGl渲染都是在另一个线程中完成的,但我意识到gl_deleteBuffers无法删除VAO,VBO。@等等,是库波前还是你称之为波前渲染器的某个类(例如,因为你渲染了OBJs)?这是我创建的一个类。@Summit也许你应该放弃GLFW直接使用并将该
render()
调用移动到QOpenGLWidget的
paintGL
。否则我不知道你为什么需要Qt。这个类是从QMainwidowyes派生的,这是我最初面临的问题所有openGl渲染都是在另一个线程中完成的,但我意识到gl_deleteBuffers无法删除VAO,VBO。@Summit等等,是库波前渲染器还是你称之为波前渲染器的某个类(例如,因为你渲染OBJs)?这是我创建的一个类。@Summit也许你应该放弃GLFW直接使用并将
render()
调用移动到QOpenGLWidget的
paintGL
。否则我不知道你为什么需要Qt。这个类是从QMainwidow派生的