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

  • 本文关键字:循环 QT GUI While qt qt5
  • 更新时间 :
  • 英文 :


我正在使用GLFW和QT进行opengl应用程序。

我在主函数中有一个 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();

}

似乎glfwPollEvents的行为方式与QApplication::exec相似,以便(某些)事件得到正确处理。
它们可能都调用DispatchMessage(请参阅),然后允许窗口的注册回调处理事件。
但也可能是两者都做了额外的簿记,这可能会使依赖该错误容易。

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

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

你甚至没有启动Qt应用程序事件循环,因为你没有调用a.exec(),因为你的代码是我一边的while循环。 我不是 opengl 专家,但我想您看到的窗口是由 opengl 本身呈现的窗口,而不是 qt 应用程序窗口中的 gl 画布。