我是靠谱客的博主 老实小笼包,最近开发中收集的这篇文章主要介绍Qt中OpenGL窗口创建的几种形式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、使用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的窗口,跑不出来。


最后

以上就是老实小笼包为你收集整理的Qt中OpenGL窗口创建的几种形式的全部内容,希望文章能够帮你解决Qt中OpenGL窗口创建的几种形式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部