2012-02-27 24 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