2013-02-21 26 views
6

Sto disegnando una scena semplice con Open GL. Ho sottoclasse QGLWidget e sovrascritto paintGL(). Niente di speciale c'è:Come forzare QGLWidget ad aggiornare lo schermo?

void CGLWidget::paintGL() 
{ 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    gluLookAt (120.0, 160.0, -300.0, 0.0 + 120.0, 0.0 + 160.0, 2.0 - 300.0, 0.0, 1.0, 0.0); 
    glScalef(1.0f/300.0f, 1.0f/300.0f, 1.0f/300.0f); 
    glClear(GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(80.0, width()/(double)height(), 5.0, 100000.0); 

    glMatrixMode(GL_MODELVIEW); 
    glBegin(GL_POINTS); 
    glColor3f(1.0f,0.6f,0.0f); 
    glVertex3d(x, y, z); 

    // ...drawing some more points... 

    glEnd(); 

} 

Ho un timer nella finestra principale che innesca updateGL() di widget di GL. Ho verificato che venga chiamato paintGL(). Tuttavia, l'immagine reale sullo schermo viene aggiornata solo molto raramente. Anche se ridimensiono la finestra, la scena non viene aggiornata. Perché è così e come posso forzarlo ad aggiornare?

+0

posso chiedere: Perché si inizializza la proiezione e la matrice MV due volte in 'paintGL'? Trai qualcosa? In caso contrario, si sovrascrivono le prime matrici con le seconde e si può spostare questo codice in 'resizeGL' (proiezione) e' initializeGL' (vista modello) – leemes

+0

@leemes: Nessuna idea, in realtà ... È un bug, residui del mio tentativo di trovare i parametri di proiezione e MV che effettivamente funzionano. Risolto, grazie. –

risposta

10

Non chiamare updateGL() dal timer, chiamare update() per assicurarsi che la vista ottenga un evento paint.

+0

Non funziona, 'paintGL()' non viene chiamato affatto allora. Provato a chiamare entrambi, anche questo non funziona. Ma grazie per il suggerimento. –

+0

Prova ad attaccare un punto di interruzione in QGLWidget :: paintEvent e controlla se arriva dopo aver chiamato update() e cosa succede dopo. – Pete

+0

Viene chiamato solo quando ridimensiono la finestra. –

8

all'interno del vostro CGLWidget costruttore

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

timer -> start(VALUE); 

gioco con `valore 10 è solo un esempio.

adornano

+0

Ehi, ho usato questa tecnica funziona. È in qualche modo possibile aggiornare immediatamente la scena non appena viene resa la scena precedente perché in questo momento ho un collo di bottiglia di 10 ms dal timer. Non posso andare più veloce di così. – activatedgeek

+0

gioca con 'VALUE 10 è solo un esempio. se metti 1 lì, sarebbe 1ms, il punto non è comunque, quando vuoi aggiornare lo schermo, il punto è quando la tua scena è pronta .. – Adorn

+0

Esattamente quello che ho detto. Non appena la mia scena è pronta, voglio che l'aggiornamento venga attivato. – activatedgeek

Problemi correlati