为什么QT循环中的While循环没有阻塞QT-GUI
我正在为opengl应用程序使用GLFW和QT 我在主函数中有一个while循环 为什么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
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派生的