qt中opengl窗口的创建
該筆記借鑒自 :
“懂deeee珍惜”的 現代OpenGL+Qt學習筆記之二:程序框架
"愛種魚的貓"的 QT中使用OpenGL(0)——創建一個窗口
引用引自qt幫助文檔。
1.創建qt工程
創建主窗口,命名為mainwindow。
2.創建OpenGL窗口(重點)
在項目中添加c++文件 命名為OpenGLWidget
注意:OpenGL窗口需要用c++類引入,不可用ui文件中現有的OpenGLWidget,原因是OpenGL窗口不僅繼承自OpenGLWidget,還繼承自QOpenGLFunctions_4_5_Core。
QOpenGLFunctions_4_5_Core中包含OpenGL_4.5的核心庫函數。
QOpenGLFunctions_4_5_Core:The QOpenGLFunctions_4_5_Core class provides all functions for OpenGL 4.5 core profile.
openglwidget.h
#include <QOpenGLWidget> #include <QOpenGLFunctions_4_5_Core>class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_4_5_Core { public:OpenGLWidget(QWidget *parent = 0);protected:void initializeGL();void resizeGL(int w, int h);void paintGL();};QOpenGLFunctions繼承的是OpenGL_ES,有興趣的同學自行研究。
The QOpenGLFunctions class provides cross-platform access to the OpenGL ES 2.0 API.
繼承QOpenGLWidget就可以實現在部件中繪圖了。
最重要的,QOpenGLWidget有3個函數paintGL()、resizeGL()、和initializeGL(),通過重寫這個3個函數,就可以實現OpenGL的初始化和繪制功能了。
initializeGL()的調用發生在另外兩個函數之前,且只會被調用一次,在這個函數中可以對OpenGL進行初始化,如設置背景色(清除顏色緩沖區)、設置全局光照、變異和鏈接著色器、創建著色程序等;
resizeGL()的調用發生在窗口第一次出現和每一次窗口改變大小時,可以在這里設置視口和投影矩陣等;
paintGL()是繪制函數,用來繪制內容,它在每一次發生重繪事件時被調用。
openglwidget.cpp
#include "openglwidget.h"OpenGLWidget::OpenGLWidget(QWidget *parent):QOpenGLWidget(parent) {}void OpenGLWidget::initializeGL() {initializeOpenGLFunctions();glClearColor(0.5f, 0.0f, 1.0f, 1.0f);glEnable(GL_DEPTH_TEST); }void OpenGLWidget::resizeGL(int w, int h) {}void OpenGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); }initializeOpenGLFunctions();
initializeOpenGLFunctions()是QOpenGLFunctions中的函數,在使用OpenGL API之前,必須先調用一次initializeOpenGLFunctions()函數,和使用glew訪問現代OpenGL API一樣,必須要先對glew庫進行初始化。
這里要把initializeOpenGLFunctions()放在initializeGL()中的最后一行,都是不行的。
3.將OpenGL部件添加到主窗口部件中
主窗口部件用QMainWindow應該會更好。但QMainWindow繼承自QWidget。
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include "openglwidget.h" //在[現代OpenGL+Qt學習筆記之二:程序框架]中使用了前置聲明QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;OpenGLWidget *glWidget; }; #endif // MAINWINDOW_H1.前綴聲明:C++類的前置聲明
前置聲明總結:一般情況優先使用#include. 二般情況水平不夠的我暫時不清楚。
2.添加OpenGL部件:
設為私有類,當mainwindow被創建時,便會創建OpenGLWidget窗口類指針。
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" //#include "openglwidget.h" //mainwindow.h頭文件已經引入,cpp文件便不再需要引入MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);glWidget = new OpenGLWidget(this);//創建OpenGL窗口,設于this(主窗口)內。glWidget->resize(800,570);glWidget->move(0,30);glWidget->show(); }MainWindow::~MainWindow() {delete ui; }對窗口的操作在這里不做詳細介紹,相關知識參照qt的博客。
我的qt博客專題路徑
總結
以上便完成了qt中對OpenGL窗口的引入
下一章便解決qt中對OpenGL函數的引入。
總結
以上是生活随笔為你收集整理的qt中opengl窗口的创建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python用支持向量机回归(SVR)模
- 下一篇: 服务器 不支持opengl,我可以在无头