无法在Qwidget中显示OpenGL

时间:2014-10-20 10:30:21

标签: c++ qt opengl

我想在this教程中制作简单的opengl项目。

我添加了继承自QGLWidget的新类GLWidget,并将我的QWidget对象提升为我已经创建的GLWidget类。当我运行项目时,我无法刷新QWidget对象。每当我构建并运行项目时,我都会看到窗口背后的内容。

它的外观如何Correct 而这正是它的真实面貌not correct

GLWidget.h

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <GL/glew.h>
#include <QGLWidget>
#include <QTimer>

class GLWidget : public QGLWidget
{
    Q_OBJECT
public:
    explicit GLWidget(QWidget *parent = 0);
    GLWidget(int width, int height);

    void initializeGL();
    void paintGL();
    void resizeGL(int w, int h);

private:
    void timerEvent(QTimerEvent *);
};

#endif // GLWIDGET_H

GlWidget.cpp

#include "glwidget.h"
#include<QMessageBox>
GLWidget::GLWidget(QWidget *parent) :
    QGLWidget(parent)
{
}

void GLWidget::initializeGL()
{
    // Init Glew
    glewExperimental = GL_TRUE;

    GLenum error = glewInit();
    if(error != GLEW_OK)
    {
        exit(1);
    }
    glClearColor( 0.2f, 0.45f, 0.8f, 1.0f ); // blue background
    glClearDepth( 1.0f );
}

GLWidget::GLWidget(int width, int height) : QGLWidget()
{
    startTimer(30);
    resize(width, height);
}

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

void GLWidget::resizeGL(int width, int height)
{
    glViewport(0, 0, width, height);
}

void GLWidget::timerEvent(QTimerEvent *)
{
    updateGL();
}

Mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

#-------------------------------------------------
#
# Project created by QtCreator 2014-10-16T20:17:33
#
#-------------------------------------------------

QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Manipulatorv2
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    glwidget.cpp

HEADERS  += mainwindow.h \
    glwidget.h

FORMS    += mainwindow.ui

INCLUDEPATH += "/home/szczepan/glew-1.11.0/include"

LIBS += -L"/home/szczepan/glew-1.11.0/lib"-lGLEW

2 个答案:

答案 0 :(得分:1)

使用GLWidget时,您应覆盖paintGL并使用参数中设置的正确位执行glClearBuffer。否则它只会占用当时缓冲区中的任何内容。

答案 1 :(得分:1)

这是使用Qt创建的示例,OpenGLWindowQGLWidget中名为INCLUDEPATH += "path/to/glew-1.5.6/include" LIBS += -L"path/to/glew-1.5.6/lib" -lGLEW #UNIX LIBS += -L"path/to/glew-1.5.6/lib" -lglew32 #WINDOWS 的简单类:

configure .pro

根据您的OpenGL版本下载GLEW库:Glew library

例如,如果我选择 glew-1.5.6

#include <GL/glew.h>
#include <QGLWidget>
#include <QTimerEvent>

class OpenGLWindow : public QGLWidget
{
public:
    OpenGLWindow(int width, int height);
    ~OpenGLWindow();

    void initializeGL();
    void paintGL();
    void resizeGL(int width, int height);

private:
    void timerEvent(QTimerEvent *);
};

使用Windows时,您必须将 glew32.dll 放在与。 exe 相同的文件夹中。

openglwindow.h

OpenGLWindow::OpenGLWindow(int width, int height) : QGLWidget()
{
    startTimer(30);
    resize(width, height);
}

OpenGLWindow::~OpenGLWindow()
{
}

void OpenGLWindow::timerEvent(QTimerEvent *)
{
    updateGL();
}

void OpenGLWindow::initializeGL()
{
    // Init Glew
    glewExperimental = GL_TRUE;

    GLenum error = glewInit();
    if(error != GLEW_OK)
    {
        exit(1);
    }

    glClearColor( 0.2f, 0.45f, 0.8f, 1.0f ); // blue background
    glClearDepth( 1.0f );
}

void OpenGLWindow::paintGL()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
}

void OpenGLWindow::resizeGL(int width, int height)
{
    glViewport(0, 0, width, height);
}

openglwindow.cpp

{{1}}

希望这段代码会有所帮助。