Qt中OpenGL窗口创建的几种形式

2 篇文章 0 订阅

一、使用QOpenGLWidget:

创建一个带widget类的项目:

widget.h为:

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
 
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
class Widget : public QOpenGLWidget, protected QOpenGLFunctions
{
    Q_OBJECT
 
public:
    Widget(QWidget *parent = 0);
    ~Widget();
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();
};
 
#endif // WIDGET_H

widget.cpp:

#include "widget.h"
 
Widget::Widget(QWidget *parent)
  : QOpenGLWidget(parent)
{
}
 
Widget::~Widget()
{
 
}
void Widget::initializeGL()
{
   initializeOpenGLFunctions();
 
}
void Widget::resizeGL(int w, int h)
{
 
    glViewport(0, 0, w, h);
 
 
 
}
void Widget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
}

main.cpp:

#include "widget.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
 
    return a.exec();
}

二、使用QGLWidget创建
需要在pro文件里+=opengl

并包含GL/glut.h 没用的话需要自己把glut.h放到Qt的include的GL文件夹下:

widget.h:

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include <QtOpenGL/QGLWidget>
#include <GL/glut.h>
class Widget : public QGLWidget
{
    Q_OBJECT
 
public:
    Widget(QWidget *parent = 0);
    ~Widget();
 
protected:
    void initializeGL();
    void resizeGL(int w,int h);
    void paintGL();
};
 
#endif // WIDGET_H

widget.cpp:

#include "widget.h"
 
Widget::Widget(QWidget *parent)
    : QGLWidget(parent)
{
}
 
Widget::~Widget()
{
 
}
 
void Widget::initializeGL()
{
    glClearColor(0.0,0.0,0.0,1.0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
 
 
}
 
void Widget::resizeGL(int w,int h){
    glViewport(0,0,(GLsizei)w,(GLsizei)h);
 
 
}
void Widget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 
}

main.cpp:

#include "widget.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
 
    return a.exec();
}

三、在有就是自己创建一个OpenGLWindow类继承自QWindow然后创建子类并覆盖初始化函数和渲染函数:
openglwindow.h:

#include <QtGui/QWindow>
#include <QtGui/QOpenGLFunctions>
 
QT_BEGIN_NAMESPACE
class QPainter;
class QOpenGLContext;
class QOpenGLPaintDevice;
QT_END_NAMESPACE
class OpenGLWindow : public QWindow, protected QOpenGLFunctions
{
    Q_OBJECT
public:
    explicit OpenGLWindow(QWindow *parent = 0);
    ~OpenGLWindow();
 
    virtual void render(QPainter *painter);
    virtual void render();
 
    virtual void initialize();
 
    void setAnimating(bool animating);
 
public slots:
    void renderLater();
    void renderNow();
 
protected:
    bool event(QEvent *event) override;
 
    void exposeEvent(QExposeEvent *event) override;
 
private:
    bool m_animating;
 
    QOpenGLContext *m_context;
    QOpenGLPaintDevice *m_device;
};

openglwindow.cpp:

#include "openglwindow.h"
 
#include <QtCore/QCoreApplication>
 
#include <QtGui/QOpenGLContext>
#include <QtGui/QOpenGLPaintDevice>
#include <QtGui/QPainter>
 
 
#include <QDebug>
 
OpenGLWindow::OpenGLWindow(QWindow *parent)
    : QWindow(parent)
    , m_animating(false)
    , m_context(0)
    , m_device(0)
{
    setSurfaceType(QWindow::OpenGLSurface);
}
 
 
OpenGLWindow::~OpenGLWindow()
{
    delete m_device;
}
 
void OpenGLWindow::render(QPainter *painter)//这个函数会在三角形类中重载
{
    Q_UNUSED(painter);//Q_UNUSED避免警告
}
 
void OpenGLWindow::initialize()//这个函数会在三角形类中重载
{
}
 
void OpenGLWindow::render()
{
}
 
void OpenGLWindow::renderLater()
{
    qDebug()<<"renderLater";
    requestUpdate();
}
 
bool OpenGLWindow::event(QEvent *event)
{
    qDebug()<<"event";
    switch (event->type()) {
 
    case QEvent::UpdateRequest:
        renderNow();
        return true;
    default:
        return QWindow::event(event);
    }
}
 
void OpenGLWindow::exposeEvent(QExposeEvent *event)
{
     qDebug()<<"exposeEvent";
    Q_UNUSED(event);
    qDebug()<<"stop1";
    if (isExposed())//是否显示,也就是最小化时
        renderNow();
    else {
        qDebug()<<"stop2";
    }
}
 
void OpenGLWindow::renderNow()
{
     qDebug()<<"renderNow";
    if (!isExposed()){
        return;
        qDebug()<<"no exposed";
        }
 
    bool needsInitialize = false;
 
    if (!m_context) {
        m_context = new QOpenGLContext(this);
        m_context->setFormat(requestedFormat());
        m_context->create();
 
        needsInitialize = true;
    }
 
    m_context->makeCurrent(this);
 
    if (needsInitialize) {
        initializeOpenGLFunctions();
        initialize();
    }
 
    render();
 
    m_context->swapBuffers(this);
 
    if (m_animating)
        renderLater();
}
 
void OpenGLWindow::setAnimating(bool animating)
{
     qDebug()<<"setAnimating";
    m_animating = animating;
 
    if (animating)
        renderLater();
}

main.cpp:

#include "openglwindow.h"
 
#include <QtGui/QGuiApplication>
#include <QtGui/QMatrix4x4>
#include <QtGui/QOpenGLShaderProgram>
#include <QtGui/QScreen>
 
#include <QtCore/qmath.h>
 
class TriangleWindow : public OpenGLWindow
{
public:
    TriangleWindow();
 
    void initialize() override;
    void render() override;//重载这两个函数
 
private:
    GLuint m_posAttr;
    GLuint m_colAttr;
    GLuint m_matrixUniform;
 
    QOpenGLShaderProgram *m_program;
    int m_frame;
};
 
TriangleWindow::TriangleWindow()
    : m_program(0)
    , m_frame(0)
{
}
 
int main(int argc, char **argv)
{
    QGuiApplication app(argc, argv);
 
 
    TriangleWindow window;
    window.resize(640, 480);
    window.show();
 
    window.setAnimating(true);
 
    return app.exec();
}
 
void TriangleWindow::initialize()
{
    qDebug()<<"initialize";
 
}
 
void TriangleWindow::render()
{
    qDebug()<<"render";
 
 
}

四、继承自QOpenGLWindow的窗口,跑不出来。

————————————————
版权声明:本文为CSDN博主「BEconfidence」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a197p/article/details/77448856

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值