我已经在QMainWindow中使用QtDesigner将QOpenGLWidget加载到我的Window类中。
小部件显示很好,我可以在主窗口看到obj模型。 我调用了来自Window的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();
}
m_transform是我的转换矩阵,可以旋转我的obj模型。
重新定义mainwindow.h中的update()槽,名为:
void MainWindow::update() {
qDebug() << "update mainwindow";
this->repaint();
}
信号和插槽之间的连接:
QObject::connect(ui->GLWidget, SIGNAL(updated()), this, SLOT(update()));
编辑:窗口类中的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";
}
我在Ubuntu上的QtCreator和OpenGL 3.3上使用Qt5.6。