QT & Opengl. Komisches Problem
Verfasst: 5. März 2010 12:59
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.
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();
}