日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

qt中opengl窗口的创建

發布時間:2024/1/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_H

1.前綴聲明:C++類的前置聲明
前置聲明總結:一般情況優先使用#include. 二般情況水平不夠的我暫時不清楚。
2.添加OpenGL部件
設為私有類,當mainwindow被創建時,便會創建OpenGLWidget窗口類指針。

OpenGLWidget *glWidget;

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窗口的创建的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。