带有QTimer的updateGL()

带有QTimer的updateGL(),qt,opengl,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 +

我在更新屏幕上的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();

}

updateGL()
调用
Spin()
之后,尝试调用
QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags)
,以强制通过绘制队列推送绘制调用


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

尝试在
updateGL()调用
Spin()后调用
QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags标志)
,强制通过绘制队列推送绘制调用


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

感谢您的快速回答。我尝试了您的建议并得到了:“错误C2275:'QEventLoop::ProcessEventsFlags':非法使用此类型作为表达式”,然后我尝试了
QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags())
并且不再有错误消息,但它仍然不起作用。flags变量是什么,应该设置为什么值?flags arg是一种枚举类型(确切地说,它是Qt自己的标志容器),虽然它是默认初始化的-但是你那里的东西基本上做了相同的事情,因为
QEventLoop::AllEvents
==0x00。Qt有非常好的文档,顺便说一句:。我已经根据答案编辑了另一个建议。感谢你的快速回答。我尝试了你的建议,得到了:“错误C2275:'QEventLoop::ProcessEventsFlags”:非法使用o如果将此类型作为表达式,则我尝试了
QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags()
,并且不再有错误消息,但它仍然不起作用。flags变量是什么,应该设置为什么值?flags arg是一种枚举类型(确切地说,它是Qt自己的标志容器),虽然它是默认初始化的-但是您在那里看到的基本上做了相同的事情,因为
QEventLoop::AllEvents
==0x00。Qt有非常好的文档,顺便说一句:。我已经根据答案编辑了另一个建议。使用update()而不是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();
}