How to use glewInit function from glew.h with QT? - qt

I coded a small QT application (version 5.1.0 (msvc2012_64_opengl), Add-in 1.2.2) in Visual studio 2012. I started with GLU.h include and the program works perfectly. But I want to implement some functions from glew.h. The first thing to do in this case is to call the 'glewInit' method a the top of the 'initializeGL' QT method. But I have the following error :
error lnk2019 unresolved external symbol __glewInit
But I noticed that the code is well exectuted without glewInit but with the #include "glew.h" and not #include "glu.h". So the linkage in the project properties are correct (glu32.lib). So the problem seems to comes from the interaction between QT and my own include of glew.h (I want to say I use glew.h since lots of time without any problem but NOT with QT).
Here's my c++ header file :
#include <gl/glew.h>
#define QT_NO_OPENGL_ES_2
#include <QGLWidget>
//#include <QtOpenGL\qgl.h>
//#include <qtopengl.h>
class HSGLWidget : public QGLWidget {
Q_OBJECT
public:
explicit HSGLWidget(QWidget *parent = 0);
virtual ~HSGLWidget();
protected:
virtual void initializeGL();
virtual void resizeGL(int width, int height);
virtual void paintGL();
virtual void keyPressEvent(QKeyEvent *keyEvent); /// From QWidget
private:
void _onSetup();
private:
QTimer *_timer;
};
My C++ source file :
#include "HSGLWidget.hpp"
#define QT_NO_OPENGL_ES_2
HSGLWidget::HSGLWidget(QWidget *parent)
: QGLWidget(parent) {
this->_onSetup();
}
HSGLWidget::~HSGLWidget() {
}
void HSGLWidget::initializeGL() {
glewInit();
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.20f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void HSGLWidget::resizeGL(int width, int height) {
if (height == 0)
height = 1;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void HSGLWidget::paintGL() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f, 0.0f, -6.0f);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();
glTranslatef(3.0f, 0.0f, -6.0f);
glBegin(GL_QUADS);
glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glVertex3d(1.0f, 1.0f, 0.0f);
glEnd();
}
And my main :
#include <QApplication>
#include "HSGLWidget.hpp"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
HSGLWidget myWin;
myWin.show();
return app.exec();
}
I tried to use #define QT_NO_OPENGL_ES_2 declaration just below my glew.h include definition but it still the same thing. I 'm really lost in front of this situation.
Does anyone can help me?

Linking failure?
Project options-> Linker-> Input
Put there the glew(For example on my project: glew32.lib)
Hope this helped you

Related

not able to draw line using QGLWiget

New to qt opengl. Am trying to draw a line in my opengl window it is not displaying.
Code is executing without error. Please help me. what is wrong in the below mentioned code.
//glwidget.cpp
#include "glwidget.h"
#include <QDebug>
#include <QGLWidget>
#include <QPainter>
GLWidget::GLWidget(QWidget *parent) :
QGLWidget(parent)
{
}
void GLWidget::initializeGL()/*initialize*/
{
qDebug()<<"iniialize";
glClearColor(0.0, 0.0, 102.0/255.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
void GLWidget::resizeGL(int width, int height)
{
qDebug()<<"resizeGL";
glViewport(0, 0, (GLint)width, (GLint)height);
}
void GLWidget::paintGL()
{
qDebug()<<"paintGL";
glBegin(GL_LINES);
glVertex3f( 0.0f, 0.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();
}
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QWidget>
#include <QGLWidget>
#include <QPainter>
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
explicit GLWidget(QWidget *parent = 0);
void initializeGL();
void resizeGL(int width, int height);
void paintGL();
};
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;/*Mainwindow*/
w.show();
return a.exec();
}
Well, you should think about what you told OpengGL to do here:
With your
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
call, you set up your projection matrix to map the world in the area 0 to 1 (in X- and Y-direction) to your screen.
Then you draw a line from 0 to -1 (in X- and Y-direction). That line lies outside your screen now.
Try some better coordinates in your GL_LINES call.
Plus, you might want to start your paintGL() routine with clearing the screen:
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

QGLWidget on ubuntu shows nothing

I'm using QGLWidget in a project with Qt5 on ubuntu. The class that extends QGLWidget is very simple, just overiding its two virtual protected functions:
Header:
class MyGLWidget : public QGLWidget {
Q_OBJECT
public:
explicit MyGLWidget(QWidget *parent = 0);
protected:
void initializeGL();
void paintGL();
};
Implementation:
MyGLWidget::MyGLWidget(QWidget *parent) :
QGLWidget(parent) {
}
void MyGLWidget::initializeGL() {
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
}
void MyGLWidget::paintGL() {
glClear(GL_COLOR_BUFFER_BIT);
}
I created an instance of it and called its show method, expecting a red window to show up, but what I got is:
The window is transparent, it displays whatever underneath it.
What indeed the problem is, and how can I fix it? (I'm using ubuntu 14.04 64bit, the Qt5.3 is installed from qt-project.org directly)
I found the same problem on the same version of Ubuntu and Qt 5.4. I do not know the exact reason but I think it's because the glClear command is not being received or executed by the graphics card unless it is followed by other draw commands. I expanded the paintGL function to include some classic test code like this:
void MyGLWidget::paintGL()
{
glViewport(0, 0, width(), height());
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-20, 20, 20, -20, -1, 1);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(10, 10, 0);
glVertex3f(-10, 10, 0);
glVertex3f(0, -10, 0);
glEnd();
}
With the additional code to render a red triangle, I found that the clear began to work for me when it had not before.

Qt just draw the first frame using QGLWidget from QT

I coded a small QT program using QGLWidget. The goal is to display a simple triangle in permanent rotation. The problem is that there is no animation because just the first frame is rendered.
Here's my main C++ source code :
#include "qtapplication.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtApplication w;
w.show();
return a.exec();
}
My qtapplication.h file :
include <QtWidgets/QMainWindow>
#include "ui_qtapplication.h"
#include "HSGLWidget.hpp"
class QtApplication : public QMainWindow
{
Q_OBJECT
public:
QtApplication(QWidget *parent = 0);
~QtApplication();
private:
Ui::QtApplicationClass ui;
HSGLWidget *_glwidget;
};
My qtapplication.cpp file :
#include "qtapplication.h"
QtApplication::QtApplication(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
this->_glwidget = NULL;
if (this->_glwidget == NULL)
this->_glwidget = new HSGLWidget();
this->_glwidget->setVisible(true);
setCentralWidget(this->_glwidget);
}
QtApplication::~QtApplication()
{
}
My HSGLWidjet.h file:
#include <QGLWidget>
class HSGLWidget : public QGLWidget {
Q_OBJECT
public:
explicit HSGLWidget(QWidget *parent = 0);
virtual ~HSGLWidget();
protected:
virtual void initializeGL();
virtual void resizeGL(int width, int height);
virtual void paintGL();
virtual void keyPressEvent(QKeyEvent *keyEvent);
private:
void _onSetup();
private:
QTimer *_timer;
};
And my HSGLWidjet.cpp file:
#include <iostream>
#include "HSGLWidget.hpp"
float toto_angle = 0.0f;
HSGLWidget::HSGLWidget(QWidget *parent)
: QGLWidget(parent)
{
this->_onSetup();
}
HSGLWidget::~HSGLWidget(void)
{
}
void HSGLWidget::initializeGL()
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.20f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void HSGLWidget::resizeGL(int width, int height)
{
if (height == 0)
height = 1;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void HSGLWidget::paintGL(void)
{
std::cout << "PAINTGL" << std::endl;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f, 0.0f, -6.0f);
glEnable(GL_MODELVIEW);
glPushMatrix();
glTranslatef(0.0f, 0.0f, 0.0f);
glRotatef(toto_angle, 1.0f, 1.0f, 1.0f);
glScalef(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
glColor3ub(255, 0, 0);
glVertex3f(0.0f, 0.75f, 0.0f);
glColor3ub(0, 255, 0);
glVertex3f(-0.75f, 0.0f, 0.0f);
glColor3ub(0, 0, 255);
glVertex3f(0.75f, 0.0f, 0.0f);
glEnd();
toto_angle+=1.0f;
glPopMatrix();
}
void HSGLWidget::keyPressEvent(QKeyEvent *keyEvent)
{
}
void HSGLWidget::_onSetup()
{
}
The string 'PAINTGL' is written just for the first frame. Normally, paintGL is called automatically. I'm really lost in front of this situation. Does anyone can help me, please ? Thanks a lot in advance for your help.
There's no problem at all, that's the standard behavior.
You see, paint() and paintGL() are called only when the window needs to be draw. That is: when your application is created, when the window is resized, or moved around. Only then paintGL() is triggered. That's it!
If you want it to be called more than once, you will need to add a timer to execute update(), which is a method that forces the window to be redraw, which in turn triggers paintGL(). Do not call paintGL() directly!
QTimer can help you achieve what you are looking for!

glewInit with Qt5 returns Missing GL version

I have been trying to use Qt5 to give me an OpenGL context, which I believe it does, but when I try to call glewInit() from within the initializeGL function, the error returns back "Missing GL version," which I have been led to believe indicates that there is no valid context. The solution I saw was to call glewInit() from within initializeGL... but I'm already doing that.
I am setting the clear color and clearing to dark red to verify that gl calls are working, which they appear to be.
Any suggestions?
main.c
#define QT_NO_OPENGL_ES_2
#include <QApplication>
#include "glwidget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GLWidget w;
w.show();
return a.exec();
}
glwidget.h
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <GL/glew.h>
#define QT_NO_OPENGL_ES_2
#include <QGLWidget>
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
explicit GLWidget(QGLWidget *parent = 0);
~GLWidget();
QSize minimumSizeHint() const;
QSize sizeHint() const;
protected:
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
};
#endif // GLWIDGET_H
glwidget.cpp
#include "glwidget.h"
GLWidget::GLWidget(QGLWidget *parent) :
QGLWidget(parent)
{
}
GLWidget::~GLWidget() {}
QSize GLWidget::minimumSizeHint() const {
return QSize(640, 480);
}
QSize GLWidget::sizeHint() const {
return QSize(800, 600);
}
void GLWidget::initializeGL() {
GLenum err = glewInit();
if (GLEW_OK != err) {
printf("GLEW error: %s\n", glewGetErrorString(err));
} else {
printf("Glew loaded; using version %s\n", glewGetString(GLEW_VERSION));
}
glClearColor(0.2f, 0, 0, 1.0f);
}
void GLWidget::resizeGL(int w, int h) {
}
void GLWidget::paintGL() {
glClear( GL_COLOR_BUFFER_BIT );
}
Something tells me this is because of the QGLWidget's default QGLFormat using OpenGL version 1.0 (Looking through GLEW's change logs, it seems the earliest version they claim to fully support is 1.5) . Try instead to override the QGLWidget constructor that requires a QGLFormat and pass it an instance of QGLFormat that uses the version you are targeting.
The call to your widget should look something like:
QGLFormat format;
format.setVersion(3,3); // or whatever version you are targeting.
format.setDoubleBuffer(true);
GLWidget * widget = new GLWidget(format);

Displaying a triangle with Qt and OpenGL

I am trying to display a triangle with OpenGL and Qt but only get a black window.
What am I doing wrong?
glwidget.h:
#pragma once
#include <QGLWidget>
class GLWidget : public QGLWidget {
public:
GLWidget(QWidget *parent = 0);
~GLWidget();
QSize sizeHint() const { return QSize(400, 400); }
protected:
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
};
glwidget.cpp:
#include "glwidget.h"
GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent) {}
GLWidget::~GLWidget(){ }
void GLWidget::initializeGL() { }
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);
glVertex3f( 0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();
}
void GLWidget::resizeGL(int w, int h)
{
QGLWidget::resize(w,h);
}
main.cpp:
#include <QApplication>
#include "glwidget.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
GLWidget glWidget;
glWidget.show();
return app.exec();
}
You must set a viewport and projection at the beginning of the paintGL member function. Put this at the beginning of your paintGL:
QSize viewport_size = size();
glViewport(0, 0, viewport_size.width(), viewport_size.height());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1, 1, -1, 1, 5, 7); // near and far match your triangle Z distance
glMatrixMode(GL_MODELVIEW);
Also if the window is double buffered, the buffers must be swapped, after drawing. Either set
setAutoBufferSwap(true);
in the constructor, to swap after paintGL returns, or add
swapBuffers();
at the end of paintGL.
triangle is transform out the form
glTranslatef(-0.5f,0.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f( 0.0f, 0.2f, 0.0f);
glVertex3f(-0.2f,-0.2f, 0.0f);
glVertex3f( 0.2f,-0.2f, 0.0f);
glEnd();

Resources