Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QOpenGLWidget未在QMainWindow中更新_C++_Qt_Opengl - Fatal编程技术网

C++ QOpenGLWidget未在QMainWindow中更新

C++ QOpenGLWidget未在QMainWindow中更新,c++,qt,opengl,C++,Qt,Opengl,我已经在QMainWindow中使用QtDesigner将QOpenGLWidget加载到我的Window类中 小部件显示很好,我可以在主窗口中看到obj模型。 从窗口调用了我的update()函数(我从qDebug()知道) 但是,除非我与主窗口交互(例如,调整其大小或在屏幕上移动),否则我的OpenGLWidget似乎无法在主窗口内重新绘制。我猜这些交互意味着整个主窗口的重新绘制 我试图在每次更新OpenGL窗口时强制重新绘制整个主窗口,但我无法做到这一点 window.cpp中的updat

我已经在QMainWindow中使用QtDesigner将QOpenGLWidget加载到我的Window类中

小部件显示很好,我可以在主窗口中看到obj模型。 从窗口调用了我的update()函数(我从qDebug()知道)

但是,除非我与主窗口交互(例如,调整其大小或在屏幕上移动),否则我的OpenGLWidget似乎无法在主窗口内重新绘制。我猜这些交互意味着整个主窗口的重新绘制

我试图在每次更新OpenGL窗口时强制重新绘制整个主窗口,但我无法做到这一点

window.cpp中的update()函数:

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";
}