2012-02-27 139 views
1

我在更新屏幕上的OpenGL模型时遇到问题。我使用定时器来更新旋转角度的每一步计时器:带QTimer的updateGL()

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(),但它也不起作用。 奇怪的是,该模型用鼠标旋转,它的工作:

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(); 
} 
+0

使用update()不updateGL() – paulm 2014-01-05 02:27:25

回答

1

尝试在Spin()updateGL()电话后打电话QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags),迫使绘制调用通过油漆队列推。

我的蛮力方法是拨打repaint(),这会完全绕过事件队列并立即呼叫paintEvent()

+0

感谢您的快速答案。我试过你的建议,并得到:'错误C2275:'QEventLoop :: ProcessEventsFlags':非法使用此类型作为表达式'然后我尝试了'QCoreApplication :: processEvents(QEventLoop :: ProcessEventsFlags()'并且没有错误消息了,但它仍然不起作用,应该设置什么值的标志变量是什么? – user1235271 2012-03-01 13:16:04

+0

标志arg是一种枚举类型(它是Qt自己的标志容器是精确的),但它是默认初始化的 - 但是你在那里基本上做同样的事情,因为'QEventLoop :: AllEvents' == 0x00。Qt有非常好的文档BTW:https://qt-project.org/doc/qt-4.8/classes.html。我已经编辑通过回答另一个建议。 – cmannett85 2012-03-01 15:25:00