PDA

View Full Version : [SOLVED] QMainWindow, QGLWidget - problems with QKeyEvents



xerionn
21st November 2008, 05:25
Hey everyone,
I am new to Qt and especially OpenGL...So here is my question.
If i sublass QMainWindow to create main window with menus and status bar that also contains one and only centralwidget (a QGLWidget to be more specific) i cant grab of the events from that QGLWidget.
If i just show the widget and dont use QMainWindow everything is ok !
Any help ?

mainwindow.h


#ifndef WINDOW_H
#define WINDOW_H

#include <QtGui/QMainWindow>
#include <QWidget>

class GLWidget;
class QAction;
class QMenu;

class Window : public QMainWindow
{
Q_OBJECT

public:
Window();

private slots:
void about();

private:
void createActions();
void createMenus();
void createStatusBar();

QMenu *fileMenu;
QMenu *helpMenu;

QAction *exitAction;
QAction *aboutAction;
QAction *aboutQtAction;

GLWidget *glWidget;

};

#endif

mainwindow.cpp


#include <QtGui>
#include "mainwindow.h"
#include "glwidget.h"

Window::Window()
{
glWidget = new GLWidget;
setCentralWidget(glWidget);

createActions();
createMenus();
createStatusBar();

setWindowTitle(tr("Blank OpenGL Environment"));
}

void Window::createActions()
{
exitAction = new QAction(tr("E&xit"), this);
exitAction->setShortcut(tr("Ctrl+Q"));
exitAction->setStatusTip(tr("Exit the application"));
connect(exitAction, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));

aboutAction = new QAction(tr("&About"), this);
aboutAction->setStatusTip(tr("Show the application's About box"));
connect(aboutAction, SIGNAL(triggered()), this, SLOT(about()));

aboutQtAction = new QAction(tr("About &Qt"), this);
aboutQtAction->setStatusTip(tr("Show the Qt library's About box"));
connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
}

void Window::createMenus()
{
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(exitAction);

helpMenu = menuBar()->addMenu(tr("&Help"));
helpMenu->addAction(aboutAction);
helpMenu->addAction(aboutQtAction);
}

void Window::createStatusBar()
{
statusBar()->showMessage(tr("Ready"));
}

void Window::about()
{
QMessageBox::about(this, tr("About OpenGL"),
tr("<h2>OpenGL Learning</h2>"
"<p>Copyright &copy;2008 xerion :D"));
}


Now lets move to glwidget.h


#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QGLWidget>

class QTimer;

class GLWidget : public QGLWidget
{
Q_OBJECT

public:
GLWidget(QWidget *parent=0);
~GLWidget();

public slots:
void timeOutSlot();

protected:
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
void timeOut();
void keyPressEvent(QKeyEvent *e);

private:
void makeObject();
void loadGLTextures();

QTimer *m_timer;

GLfloat rotx, roty;
GLfloat z;
GLfloat drotx, droty;

GLfloat LightAmbient[4];
GLfloat LightDiffuse[4];
GLfloat LightPosition[4];

bool light;
GLuint filter;
GLuint texture[3];
};

#endif




#include <QtGui>
#include <QtOpenGL>
#include <math.h>
#include "glwidget.h"
#include <qapplication.h>
#include <qtimer.h>

//constructor
GLWidget::GLWidget(QWidget *parent)
: QGLWidget(parent)
{
m_timer = new QTimer( this );
connect( m_timer, SIGNAL(timeout()), this, SLOT(timeOutSlot()) );
m_timer->start( 50 );

LightAmbient[0]= 0.5f;
LightAmbient[1]= 0.5f;
LightAmbient[2]= 0.5f;
LightAmbient[3]= 1.0f;

LightDiffuse[0]= 1.0f;
LightDiffuse[1]= 1.0f;
LightDiffuse[2]= 1.0f;
LightDiffuse[3]= 1.0f;

LightPosition[0]= 0.0f;
LightPosition[1]=0.0f;
LightPosition[2]=2.0f;
LightPosition[3]=1.0f;

rotx = roty = 0.0f;
z = -5.0f;
drotx = droty = 0.0f;
filter = 0;
light = true;
}

//destructor
GLWidget::~GLWidget()
{
makeCurrent();
}

void GLWidget::initializeGL()
{
loadGLTextures();

glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);
glEnable(GL_LIGHT1);

}

void GLWidget::resizeGL( int width, int height )
{
height = height?height:1;

glViewport( 0, 0, (GLint)width, (GLint)height );

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void GLWidget::paintGL()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();

makeObject(); //create our object
}

void GLWidget::makeObject()
{
glTranslatef(0.0f,0.0f,z);

glRotatef(rotx,1.0f,0.0f,0.0f);
glRotatef(roty,0.0f,1.0f,0.0f);

glBindTexture(GL_TEXTURE_2D, texture[filter]);

glBegin(GL_QUADS);
// Front Face
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
// Back Face
glNormal3f( 0.0f, 0.0f,-1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
// Top Face
glNormal3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
// Bottom Face
glNormal3f( 0.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
// Right face
glNormal3f( 1.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
// Left Face
glNormal3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
}

void GLWidget::timeOutSlot()
{
timeOut();
}

void GLWidget::timeOut()
{
rotx+=drotx;
roty+=droty;

updateGL();
}

void GLWidget::loadGLTextures()
{
QImage t;
QImage b;

if ( !b.load( "../images/crate.bmp" ) )
{
b = QImage( 16, 16, QImage::Format_ARGB32 );
b.fill( Qt::green);
}

t = QGLWidget::convertToGLFormat( b );
glGenTextures( 3, &texture[0] );

glBindTexture( GL_TEXTURE_2D, texture[0] );
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTE R,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE R,GL_NEAREST);
glTexImage2D( GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() );

glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTE R,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE R,GL_LINEAR);
glTexImage2D( GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() );

glBindTexture(GL_TEXTURE_2D, texture[2]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTE R,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE R,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, t.width(), t.height(), GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
}

void GLWidget::keyPressEvent( QKeyEvent *e )
{
switch( e->key() )
{
case Qt::Key_L:
light = !light;

if( light )
glEnable( GL_LIGHTING );
else
glDisable( GL_LIGHTING );

break;

case Qt::Key_F:
filter++;
if( filter > 2 )
filter = 0;

break;

case Qt::Key_Left:
droty -= 0.01f;

break;

case Qt::Key_Right:
droty += 0.01f;

break;

case Qt::Key_Up:
drotx -= 0.01f;

break;

case Qt::Key_Down:
drotx += 0.01f;

break;

case Qt::Key_PageDown:
z -= 0.02f;

break;

case Qt::Key_PageUp:
z += 0.02f;

case Qt::Key_Escape:
close();
}
}


Last our main.cpp


#include <QApplication>
#include <QtGui>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

Window window;
window.resize( 400, 350 );
window.show();
return app.exec();
}


If i instead use this and dont use at all the mainwindow.h and mainwindow.cpp the QKey Evnts work



#include <QApplication>
#include <QtGui>
#include <QGLWidget>
#include "glwidget.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QGLWidget *glWidget = new GLWidget;
glWidget->show();
return app.exec();
}

So my question is why they dont work when i use QMainWindow

xerionn
21st November 2008, 08:00
Duh Silly me, i had the setFocus to a wrong position !