Seite 1 von 1

QT & Opengl. Komisches Problem

Verfasst: 5. März 2010 12:59
von kater
Hallo,
versuche mich grade etwas mit Opengl. Habe frueher mit GLUT schon ein paar mal opengl benutzt aber mein jetziges Problem rührt sicherlich von Qt her.

Ich benutze QGLWidget um meine Scene zu zeichnen, siehe Code. Anscheinend immer wenn das Fenster den Fokus verliert, also wenn man zu einem anderen Desktop wechselt, zu einem andern Window oder einen anderen Tab, falls ich das WIdget in einem QTabWidget gelegt habe wird di Scene in die obere links Ecke gerendert.
Und da bleibt sie auch. Ich kann die Koordinaten der Punkte veraendern aber sie bewegen sich nicht weg.
Die Y Achse scheint auch vertauscht zu sein. Wenn ich die Scene früher nach oben wegen konnte, beweg sie sich jetzt ein kleines bissel nach unten.
Hoffe das ist verständlich.

Mir fehlt da gerade der Ansatz wo der Fehler liegt.

Code: Alles auswählen

#include "blubb.h"

blubb::blubb(QWidget *parent) : QGLWidget(parent)
{

    z = 20;
    x = y = 0;

    glInit();
}


void blubb::initializeGL()
{
    // Set up the rendering context, define display lists etc.:
    qDebug() << "Konstructor\n";

    glClearColor (0.0, 0.0, 0.0, 0.0); // Clear the color
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_DOUBLEBUFFER);

}

//This virtual function is called whenever the widget has been resized. The new size is passed in width and height.
// Reimplement it in a subclass.
void blubb::resizeGL(int w, int h)
{
    // setup viewport, projection etc.:

    qDebug() << "resize () " << w << "x" << h;
    glMatrixMode (GL_PROJECTION); // Set the Matrix mode
    glLoadIdentity();
    glViewport (0, 0, (GLsizei) w, (GLsizei) h); // Set the viewport
    gluPerspective(75, (GLfloat) w /(GLfloat) h , 0.10, 100.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt (x, y, z,  x, y, z-0.5, 0.0, 1.0, 0.0);

}

void blubb::draw()
{

    qDebug() << "Koor: "<< x << " " << y << " " << z;
    qDebug() << "draw()";

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_POINTS);
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(0.0f, 2.0f,0.0f);
    glVertex3f(0.0f, 0.0f,0.0f);
    glEnd();



    glColor3f(1,0,0);
    // Qt Funktion
    renderText(0,0,0, "0123456789");
//
//    Swaps the screen contents with an off-screen buffer. This only works if the widget's format specifies double buffer mode.
//
//    Normally, there is no need to explicitly call this function because it is done automatically after each widget repaint, i.e. each time after paintGL() has been executed.
//
//    See also doubleBuffer(), se
    swapBuffers();

}


void blubb::wheelEvent(QWheelEvent *e)
{
    qDebug() << e->x() << "x" << e->y() << "mouse wheel event " << z;
    e->delta() > 0 ? z+=1 : z-=1;

    glLoadIdentity();
    gluLookAt (x, y, z,  x, y, z-0.5, 0, 1.0, 0.0);
    draw();

}

void blubb::paintEvent(QPaintEvent *event)
{
    qDebug() << "Paintevent";
//    draw();
}

void blubb::mouseMoveEvent(QMouseEvent *e)
{
    qDebug() << e->x() << "x" << e->y() << " Mousemovevent()";
    static int xold = 0;
    static int yold = 0;

    if(e->x() < xold)
    {
        x += 0.2;
        xold = e->x();

    }
    else if(e->x() > xold)
    {
        x -= 0.2;
        xold = e->x();

    }

    if(e->y() < yold)
    {
        y -= 0.2;
        yold = e->y();
    }
    else if(e->y() > yold)
    {
        y += 0.2;
        yold = e->y();

    }

    glLoadIdentity();
    gluLookAt (x, y, z,  x, y, z-0.5, 0, 1.0, 0.0);
    draw();

}
//This virtual function is called whenever the widget needs to be painted. Reimplement it in a subclas
void blubb::paintGL()
{
    qDebug() << "paintGL()";
    draw();
}

Verfasst: 5. März 2010 23:08
von N&#164;X
Also den Fehler kann ich mir auch nicht so ganz erklären, aber ein paar Sachen solltest du an deinem Programm noch ändern:

Den Inhalt von draw kannst du eigentlich komplett in die paintGL werfen. Wenns mal aufwändiger wird kannst du natürlich Teile auslagern, aber z.B. glClear sollte immer da drin bleiben.
Wenn du neu Zeichnen willst (z.B. in WheelEvent) darfst du keine render-Funktion (wie z.B. paintGL) selber aufrufen sondern du rufst einfach updateGL() auf, das macht dann alles für dich, sogar Buffer swappen (Das musst du also auch nicht selber machen).
Außerdem kannst du dir den Aufruf von glInit sparen, das macht Qt auch automatisch für dich beim initialisieren.

Qt meint es nur gut mit dir und will dir ein paar Dinge abnehmen, also einfach an die Doku halten und alles sollte tun, vllt ist dann auch dein Bug weg.
Beispiele gibts natürlich auch in der Doku verlinkt, wie z.B. das Hello GL Example das dich vllt interessieren könnte als Neueinsteiger.

Verfasst: 6. März 2010 00:36
von kater
Joar ich blick da noch nicht so durch. Hatte die Sachen vorher in paintGL und iwie ging dann garnichts.
Mein resize Event geht auch nicht. Werde mich mal genauer an die Beispiel halten und berichten ob es was bringt.

Verfasst: 6. März 2010 01:27
von kater
Jetzt geht es. Komisch. Erst das mit dem updateGL eingebaut. Nichts verändert. Dann die resizeGL Funktion laut Beispiel angepasst: garkein Bild mehr. Änderung wieder rückgängig gemacht: nun geht alles richtig.

Dabei wird die resize Funktion garnicht aufgerufen wenn man das Fenster wechselt