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 <QWidget>
#include <QGLWidget>

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 <GL/glu.h>         //需要添加頭文件,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 <QApplication>
#include <QtWidgets>

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

    return a.exec();
}

然後執行qmake,應該沒有問題,點擊構建,應該會報鏈接錯誤,這需要引入庫文件

 在.pro中加入下邊這兩行

win32: LIBS += -lOpenGL32

win32: LIBS += -lGlU32

清理,然後重新qmake和構建,運行結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章