QTCreator使用QT OpenGL

 初次接触QT OpenGL,过程中还是有一些坑的,记录一下。(QT5.7)

#-------------------------------------------------
#
# Project created by QtCreator 2020-01-07T11:45:47
#
#-------------------------------------------------

QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = myGl
TEMPLATE = app


SOURCES += main.cpp\
    MyGLWidget.cpp

HEADERS  += \
    MyGLWidget.h

FORMS    += MainWindow.ui

.pro文件中主要需要添加QT += opengl这一句,需要包含opengl模块,要使用QT的OpenGL,需要继承QGLWidget类,然后实现QGLWidget提供了三个虚函数:

    initializeGL():设置OpenGL渲染环境,定义显示列表等。该函数只在第一次调用resizeGL()或paintGL()前被调用一次;

    resizeGL():设置OpenGL的视口、投影等。每次部件改变大小时都会调用该函数;

    paintGL():渲染OpenGL场景。每当部件需要更新时都会调用该函数。

//MyGLWidget.h

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H

#include 
#include 

class MyGLWidget : public QGLWidget       //需要继承QGLWidget类   
{
    Q_OBJECT
public:
    explicit MyGLWidget(QWidget *parent = 0);
    ~MyGLWidget();

protected:
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();
};

#endif // MYGLWIDGET_H
//MyGLWidget.cpp


#include "MyGLWidget.h"

#include          //需要添加头文件,QT版本不同,文件名可能不同

MyGLWidget::MyGLWidget(QWidget *parent) : QGLWidget(parent)
{

}

MyGLWidget::~MyGLWidget()
{

}

void MyGLWidget::initializeGL()
{
    glClearColor(0.0,0.0,0.0,0.0);
    glShadeModel(GL_SMOOTH);
    glClearDepth(1.0);
    glEnable(GL_DEPTH_TEST);
}

void MyGLWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, (GLint)w, (GLint)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0, (GLfloat)w/(GLfloat)h, 0.1, 100.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void MyGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    //绘制三角形
    glTranslatef(-2.0, 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();
    //绘制四边形
    glTranslated(4.0, 0.0, 0.0);
    glBegin(GL_QUADS);                       //绘制四边形
    glVertex3f(-1.0, 1.0, 0.0);
    glVertex3f(1.0, 1.0, 0.0);
    glVertex3f(1.0, -1.0, 0.0);
    glVertex3f(-1.0, -1.0, 0.0);
    glEnd();
}

在开始绘制以前,先要使用glClear()清除屏幕和深度缓存。然后重置了模型视图矩阵,这样便将当前点移动到了窗口的中心,现在窗口中心即为坐标原点,X轴从左到右,Y轴从下到上,Z轴从里到外。完成这两步以后就可以进行图形的绘制了,在图形绘制开始时,一般会使用glTranslatef()来移动坐标原点,它是相对于当前点来移动的,比如这里先将坐标原点左移2.0,向里移6.0,然后绘制了三角形(TRIANGLES)。绘制从glBegin()开始,到glEnd()结束,使用glVertex3f()来设置各个顶点的坐标,顶点的绘制顺序可以是顺时针,也可以是逆时针。要注意逆时针绘制出来的是正面,而顺时针绘制出来的是反面,这一点在后面的纹理贴图部分会显示出来。当绘制完三角形以后,又将原点相对于当前点向右移动了4.0,然后绘制了一个四边形(QUADS)。 

// main.cpp

#include "MyGLWidget.h"
#include 
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyGLWidget w;
    w.resize(400, 300);
    w.show();

    return a.exec();
}

然后执行qmake,应该没有问题,点击构建,应该会报链接错误,这需要引入库文件

QTCreator使用QT OpenGL_第1张图片

 在.pro中加入下边这两行

win32: LIBS += -lOpenGL32

win32: LIBS += -lGlU32

清理,然后重新qmake和构建,运行结果如下:

QTCreator使用QT OpenGL_第2张图片

你可能感兴趣的:(openGL,QT)