使用QTimer更新updateGL()

时间:2012-02-27 10:11:49

标签: qt opengl

我在屏幕上更新OpenGL模型时遇到问题。我使用计时器在每个计时器步骤更新旋转角度:

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(Spin()));
timer->start(500);

void GLWidget::Spin()
{
    qDebug() << "Spin()";

    rotationX  += 5;
    rotationY  += 5;
    rotationZ  += 5;
    updateGL();

}

我也尝试过update()而不是updateGL(),但它也不起作用。 奇怪的是,通过用鼠标旋转模型它确实有效:

void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
    GLfloat dx = GLfloat(event->x() - lastPos.x()) / width();
    GLfloat dy = GLfloat(event->y() - lastPos.y()) / height();
    if (event->buttons() & Qt::LeftButton) {
        rotationX += 180 * dy;
        rotationY += 180 * dx;
        updateGL();
    } else if (event->buttons() & Qt::RightButton) {
    rotationX += 180 * dy;
        rotationZ += 180 * dx;
        updateGL();
    }
    lastPos = event->pos();
}

1 个答案:

答案 0 :(得分:1)

QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags)updateGL()调用后尝试调用Spin(),强制将绘制调用推送到绘制队列中。

我的强制方法是调用repaint(),这会完全绕过事件队列并立即调用paintEvent()