1. 程式人生 > >學習筆記0--如何在Qt5中嵌入一個OpenGL程式部件

學習筆記0--如何在Qt5中嵌入一個OpenGL程式部件

緣由:從元旦過後開始,由於實驗室需要,開始進行再Qt5中的OpenGL的開發任務,在剛開始任務時,困難重重,想必也有網友會遇到與我相同或者類似的問題,故整理一些我自己在開發過程中的一些值得參考部分與大家分享,如有版權問題,請直接留言與我聯絡。

在Qt5中開發OpenGL時,你會發現原來舊的Qt OpenGL板塊已經不推薦在新程式碼中使用,新的OpenGL的類已經被包含在Qt GUI和Qt Widgets中,本例將使用新的類來建立一個內嵌在視窗中的OpenGL部件

具體步驟:

(1)新建一個Qt Widgets Application工程,選擇QMainWindow作為基類(當然其它也可以);

(2)設計ui檔案(圖1);

選擇一個Widget控制元件拖入視窗,選擇在視窗中進行柵格佈局

圖1

(3)新增繪製OpenGL的類(圖2);

圖2

修改openglwindow類的檔案:

openglwindow.h:

#ifndef OPENGLWINDOW_H
#define OPENGLWINDOW_H

#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>

class openglwindow : public QOpenGLWidget,
                     protected QOpenGLFunctions_3_3_Core
{
    Q_OBJECT

public:
    openglwindow(QWidget *parent = 0);
    ~openglwindow();

    void initializeGL();
    void resizeGL(int width, int height);
    void paintGL();
};

#endif // OPENGLWINDOW_H
openglwidow.cpp:
#include "openglwindow.h"

openglwindow::openglwindow(QWidget *parent)
    :QOpenGLWidget(parent)
{
    //設定OpenGL的版本資訊
    QSurfaceFormat format;
    format.setRenderableType(QSurfaceFormat::OpenGL);
    format.setProfile(QSurfaceFormat::CoreProfile);
    format.setVersion(3,3);
    setFormat(format);
}

openglwindow::~openglwindow()
{

}

void openglwindow::initializeGL()
{
    //初始化OpenGL函式
    initializeOpenGLFunctions();

    //設定全域性變數
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

void openglwindow::paintGL()
{
    //清理螢幕
    glClear(GL_COLOR_BUFFER_BIT);
}

void openglwindow::resizeGL(int width, int height)
{
    //未使用
    Q_UNUSED(width);
    Q_UNUSED(height);
}

(4)控制元件提升為已建立的類(圖3);

圖3

先新增openglwindow類,在將Widget控制元件提升為該類即可。

好了,經過以上步驟後點擊執行就可以看到效果(圖4)。

圖4

編譯環境及版本:Win10企業版+Qt 5.7.0(MSVC 2013, 32bit)+OpenGL3.3 Core Profile