C++ QOpenGLWidget未在QMainWindow中更新
我已经在QMainWindow中使用QtDesigner将QOpenGLWidget加载到我的Window类中 小部件显示很好,我可以在主窗口中看到obj模型。 从窗口调用了我的update()函数(我从qDebug()知道) 但是,除非我与主窗口交互(例如,调整其大小或在屏幕上移动),否则我的OpenGLWidget似乎无法在主窗口内重新绘制。我猜这些交互意味着整个主窗口的重新绘制 我试图在每次更新OpenGL窗口时强制重新绘制整个主窗口,但我无法做到这一点 window.cpp中的update()函数:C++ QOpenGLWidget未在QMainWindow中更新,c++,qt,opengl,C++,Qt,Opengl,我已经在QMainWindow中使用QtDesigner将QOpenGLWidget加载到我的Window类中 小部件显示很好,我可以在主窗口中看到obj模型。 从窗口调用了我的update()函数(我从qDebug()知道) 但是,除非我与主窗口交互(例如,调整其大小或在屏幕上移动),否则我的OpenGLWidget似乎无法在主窗口内重新绘制。我猜这些交互意味着整个主窗口的重新绘制 我试图在每次更新OpenGL窗口时强制重新绘制整个主窗口,但我无法做到这一点 window.cpp中的updat
void Window::update()
{
qDebug() << "update" ;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_transform.rotate(5.0f, QVector3D(0.4f, 0.3f, 0.3f));
emit updated() ;
// Schedule a redraw
paintGL();
}
编辑:窗口类中的paintGL函数:
void Window::paintGL()
{
qDebug() << "paintGl" ;
// Clear
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.2f, 1.0f);
// Render using our shader
m_program->bind();
m_program->setUniformValue(u_worldToCamera, m_camera.toMatrix());
m_program->setUniformValue(u_cameraToView, m_projection);
{
m_program->setUniformValue(u_modelToWorld, m_transform.toMatrix());
m_model.draw(m_program) ;
}
m_program->release();
qDebug() << "end paintGL";
}
void Window::paintGL()
{
qDebug()绑定();
m_program->setUniformValue(u_worldToCamera,m_camera.toMatrix());
m_程序->设置统一值(u_摄像机视图、m_投影);
{
m_program->setUniformValue(u_modelToWorld,m_transform.toMatrix());
m_模型绘制(m_程序);
}
m_程序->发布();
qDebug()当您尝试重新绘制OpenGLWidget
时,是否确定存在有效的OpenGL上下文活动?OpenGLWidget::paintGL
通常应作为调用QWidget::update
插槽的结果间接调用。您的意思是我不应称自己为“paintGL()”在更新结束时?我无法删除它,因为paintGL()在任何时间段都会自动调用。我不知道如何检查上下文是否有效。实际上,当我从更新函数中删除paintGL时,它不再被调用。但我仍然可以看到我的模型。不要调用repaint()
(几乎从不需要,也不做你认为它会做的事);也不要明确地调用paintGL()
(当GL小部件需要重新绘制时,会自动调用它,手动调用它来破坏它);不要调用你的update()
(你在基类中隐藏了这个函数);不要从外部调用GL代码paintGL()
和朋友(否则您没有GL上下文)。有以下前提:1)只需覆盖paintGL()
并在那里进行绘制;2)如果您需要为GL小部件安排重画,只需在上面调用update()
。我想覆盖update()所以它会被自动调用。我也添加了我的paintGL()函数(完成所有绘图),我已经覆盖了它。所以你的建议是在paintGL()函数中做动画(对象的移动)?我会试试这个。
QObject::connect(ui->GLWidget, SIGNAL(updated()), this, SLOT(update()));
void Window::paintGL()
{
qDebug() << "paintGl" ;
// Clear
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.2f, 1.0f);
// Render using our shader
m_program->bind();
m_program->setUniformValue(u_worldToCamera, m_camera.toMatrix());
m_program->setUniformValue(u_cameraToView, m_projection);
{
m_program->setUniformValue(u_modelToWorld, m_transform.toMatrix());
m_model.draw(m_program) ;
}
m_program->release();
qDebug() << "end paintGL";
}