openGL的图像在Qt的界面中显示

来源:互联网 发布:js弹出输入框 编辑:程序博客网 时间:2024/06/05 19:58

学习编程有一段时间了,今天开始写自己的第一篇博客,以前从没写过,发现程序中遇到的许多问题当时解决后就忘记解决方法了,下次遇到又要百度,太浪费时间了。废话少说,写起:
本代码的平台Qt5.5.1+Vs2013+win7。openGL在Qt的界面中显示是通过QGLWidget累实现的,首先得创建一个父类为QGLWidget的类。initializeGL()完成OpenGL环境的初始化,paintGL()绘制OpenGL图形,resizeGL()在窗口发生改变时运行。以下代码利用此方法,在窗口中显示一个简单的三角形。
新建一个Qt的工程,然后在界面中加入一个widget控件,将其提升为myQtOpenglWindow。其实很简单,但是自己摸索可能有点麻烦。我也是在http://blog.csdn.net/damotiansheng/article/details/42192139的基础上做的。

//myqtopenglwindow.h#ifndef MYQTOPENGLWINDOW_H  #define MYQTOPENGLWINDOW_H  #include <QtOpenGL/QtOpenGL>  #include <QtOpenGL/QGLWidget>  #include <QWidget>  class myQtOpenglWindow : public QGLWidget{    Q_OBJECTpublic:    explicit myQtOpenglWindow(QWidget* parent = 0, const char* name = 0, bool fs = false); \        ~myQtOpenglWindow();protected:    void initializeGL();    void paintGL();    void resizeGL(int width, int height);    void keyPressEvent(QKeyEvent *);protected:    bool fullScreen;signals:    public slots :};#endif // MYQTOPENGLWINDOW_H  
//myqtopenglwindow.cpp#include "myqtopenglwindow.h"  #include <gl/GLU.h>  myQtOpenglWindow::myQtOpenglWindow(QWidget* parent, const char* name, bool fs)    :QGLWidget(parent){    //保存窗口是否为全屏的状态。      fullScreen = fs;    //设置窗口的位置,即左上角为(0,0)点,大小为640*480。      //setGeometry(20,30, 640, 480);    // 设置窗口的标题为“My's OpenGL Framework”。      //setCaption( "My's OpenGL Framework" );      // 如果fullscreen为真,那么就全屏显示这个窗口。      if (fullScreen)    {        showFullScreen();    }}myQtOpenglWindow::~myQtOpenglWindow(){}void myQtOpenglWindow::initializeGL(){    glShadeModel(GL_SMOOTH);    glClearColor(0.0, 0.0, 0.0, 0.0);    glClearDepth(1.0);    glEnable(GL_DEPTH_TEST);    glDepthFunc(GL_LEQUAL);    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);    return;}void myQtOpenglWindow::paintGL(){    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    glLoadIdentity();    glTranslatef(-1.5, 0.0, -6.0);    glBegin(GL_TRIANGLES);    glVertex3f(0.0, 1.0, 0.0);    glVertex3f(-1.0, -1.0, 0.0);    glVertex3f(1.0, -1.0, 0.0);    glEnd();    return;}void myQtOpenglWindow::resizeGL(int width, int height){    //防止height为0      if (height == 0)    {        height = 1;    }    //重置当前的视口(Viewport)      glViewport(0, 0, (GLint)width, (GLint)height);    glClearColor(1.0f, 1.0f, 0.5f, 0.0f);    //选择投影矩阵。      glMatrixMode(GL_PROJECTION);    //重置投影矩阵      glLoadIdentity();    //建立透视投影矩阵      gluPerspective(45.0, (GLfloat)width / (GLfloat)height, 0.1, 100.0);    //gluPerspective(45.0,(GLfloat)width() / (GLfloat)height(),0.1,100.0);      // 选择模型观察矩阵      glMatrixMode(GL_MODELVIEW);    // 重置模型观察矩阵。      glLoadIdentity();    return;}void myQtOpenglWindow::keyPressEvent(QKeyEvent * e){    switch (e->key())    {        //如果按下了F2键,那么屏幕是否全屏的状态就切换一次。然后再根据需要,显示所要的全屏窗口或者普通窗口。    case Qt::Key_F2:        fullScreen = !fullScreen;        if (fullScreen)        {            showFullScreen();        }        else        {            showNormal();            setGeometry(0, 0, 640, 480);        }        updateGL();        break;        //如果按下了Escape键,程序退出。      case Qt::Key_Escape:        close();    }    return;}
//qtopenglwindow.h#ifndef QTOPENGLWINDOW_H#define QTOPENGLWINDOW_H#include <QtWidgets/QMainWindow>#include "ui_qtopenglwindow.h"class QtOpenGLWindow : public QMainWindow{    Q_OBJECTpublic:    QtOpenGLWindow(QWidget *parent = 0);    ~QtOpenGLWindow();private:    Ui::QtOpenGLWindowClass ui;};#endif // QTOPENGLWINDOW_H
qtopenglwindow.cpp#include "qtopenglwindow.h"QtOpenGLWindow::QtOpenGLWindow(QWidget *parent)    : QMainWindow(parent){    ui.setupUi(this);}QtOpenGLWindow::~QtOpenGLWindow(){}
//main.cpp#include "qtopenglwindow.h"#include <QtWidgets/QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    QtOpenGLWindow w;    w.show();    return a.exec();}![程序的效果](http://img.blog.csdn.net/20170221205142616?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2JmXzEwMjI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
0 0
原创粉丝点击