2013-02-21 14 views
6

Rysuję prostą scenę z Open GL. Podklasy QGLWidget i overriden paintGL(). Nic nadzwyczajnego tam:Jak zmusić QGLWidget do aktualizacji ekranu?

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(); 

} 

Mam czasomierza w głównym oknie, które wywołają updateGL() widgetu GL. Sprawdziłem, że powoduje wywołanie paintGL(). Jednak rzeczywisty obraz na ekranie jest bardzo rzadko aktualizowany. Nawet jeśli zmieniam rozmiar okna, scena nie jest aktualizowana. Dlaczego tak jest i jak mogę go zmusić do aktualizacji?

+0

Mogę zapytać: Dlaczego zainicjować projekcję i MV matrycę dwa razy w 'paintGL'? Czy narysujesz coś pomiędzy? Jeśli nie, zastępujesz pierwsze macierze tymi drugimi i możesz przenieść ten kod do 'resizeGL' (rzutowanie) i' initializeGL' (model-view) – leemes

+0

@leemes: Nie ma pojęcia, faktycznie ... To jest błąd, pozostałości moich prób znalezienia parametrów projekcji i MV, które faktycznie działają. Naprawiono, dziękuję. –

Odpowiedz

10

Nie wywołaj funkcji updateGL() z licznika czasu, wywołaj funkcję update(), aby upewnić się, że w widoku pojawi się zdarzenie paint.

+0

Nie działa, 'paintGL()' nie jest wtedy w ogóle wywoływany. Próba wywoływania obu - także nie działa. Ale dzięki za podpowiedź. –

+0

Spróbuj trzymać punkt przerwania w QGLWidget :: paintEvent i sprawdź, czy dostanie się tam po wywołaniu update() i co się stanie później. – Pete

+0

Jest wywoływana tylko podczas zmiany rozmiaru okna. –

8

wewnątrz konstruktora CGLWidget

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

timer -> start(VALUE); 

zabaw z `wartość 10 jest tylko przykładem.

Adorn

+0

Hej, użyłem tej techniki, która działa. Czy mogę jakoś natychmiast zaktualizować scenę, gdy tylko zostanie wykonana poprzednia scena, ponieważ teraz mam wąskie gardło 10 ms od timera. Nie mogę iść szybciej. – activatedgeek

+0

gra z 'VALUE 10 to tylko przykład. jeśli umieścisz tam 1, będzie to 1ms, punkt nie jest jednak, gdy chcesz odświeżyć ekran, punkt jest, gdy twoja scena jest gotowa .. – Adorn

+0

Dokładnie to, co powiedziałem. Gdy tylko moja scena jest gotowa, chcę, aby aktualizacja została uruchomiona. – activatedgeek

Powiązane problemy