【问题标题】:Can't display OpenGL in Qwidget无法在 Qwidget 中显示 OpenGL
【发布时间】:2014-10-20 10:30:21
【问题描述】:

我想像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();
}

主窗口.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

主窗口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

【问题讨论】:

    标签: c++ qt opengl


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这是一个使用Qt 创建的示例,一个名为OpenGLWindow 的简单类来自QGLWidget

      配置.pro

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

      例如,如果我选择 glew-1.5.6

      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
      

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

      openglwindow.h

      #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 *);
      };
      

      openglwindow.cpp

      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);
      }
      

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

      【讨论】:

      • glClearColor/Depth 在大多数情况下应该进入initializeGL,或者至少在glClear之前。
      • 它不会改变结果,但你是对的,这是一种更好的方法。
      • glwidget.h:4:错误:GL/glew:没有这样的文件或目录#include 。 glew 是以前版本中 QTCreator 的一部分吗?我之所以选择 QT Creator,是因为我认为它很适合明星。我也有 Microsoft Visual Studio 2013。什么是 bether?在互联网上,我得到了 100 个旧版本 OpenGl 的教程,当我尝试新的“bether opengl”时,它总是失败。
      • GLEW 是您使用新的 OpenGL 功能所需的主库。我更喜欢使用 Qt,因为我开始学习 OpenGL。看看,我只是编辑我的帖子。
      猜你喜欢
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多