该笔记借鉴自 :

“懂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窗口的创建相关推荐

  1. QT中OpenGL开发起步

    OpenGL中环境搭建 近期由于需要做一个GUI展示的OpenGL程序,因此想到用QT来做界面,需要在QT中写OpenGL,配完环境后,在这里总计一下. QT基础 总体看来,QT的版本较为混乱,有时候 ...

  2. Qt中另一种创建线程的方式

    文章目录 1 Qt中另一种创建线程的方式 1.1 另一种创建线程的方式 1.2 同步型线程的设计 1.3 异步型线程的设计 1 Qt中另一种创建线程的方式 1.1 另一种创建线程的方式 历史的痕迹: ...

  3. 在Qt中使用C++代码创建界面

    好儿郎~志在四方 Qt视频教程地址:http://space.bilibili.com/84360636/#!/index 目录视图 摘要视图 订阅 图灵赠书--程序员11月书单    [思考]Pyt ...

  4. QT中关于窗口全屏显示与退出全屏的实现

    近期在学习QT时遇到了很多问题这也是其中一个,个人通过在各种书籍和网络上的查阅找到了一些关于这方面的答案,希望能给大家一些帮助. 首先,在QT中对于窗口显示常用的有这么几个方法可以调用: Qt全屏显示 ...

  5. qt中设置窗口左上角的图标

    前面一节已经详细的讲解了怎么添加图片到qt的图片资源文件中,这里就不赘述了,不太了解的可以看看博主的这篇随笔:qt中建立图片资源管理文件 this->setWindowIcon(QIcon(&q ...

  6. QT中父子窗口事件传递与事件过滤器

    处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...

  7. Qt中设置窗口边框的圆形

    Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口. 下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this ...

  8. qt中关闭窗口资源释放问题

    针对QDialog对象,如果是栈上分配的,就不存在资源泄漏问题,但是当对象是new出来的,并且以局部对像存在,当关闭时,窗口只是隐藏,资源是没有释放的,每次exec后者需要delete来释放,另外一种 ...

  9. qt中拖动窗口widget

    提要 继承与QDialog的窗口,窗口原本按住标题栏可以拖动窗口,但是设置了窗口的隐藏标题栏属性后,窗口不再能够拖动.或者继承于QWidget的窗体,不具有窗口拖动功能. 本文实现继承于窗口widge ...

最新文章

  1. 谷歌浏览器实现按下按键的脚本_chrome浏览器控制台创建js脚本并执行
  2. R语言使用pROC包在同一图中绘制两条ROC曲线并通过假设检验检验ROC曲线的AUC或者偏AUC的差异(输出p值)
  3. 《Web前端开发精品课 HTML与CSS进阶教程》——1.4 id和class
  4. 现代计算机系统中运算器设计一般采用的是,全国2014年4月高等教育自学考试计算机原理试题课程代码:02384...
  5. 如何将多个PDF合成为一个PDF,并且大小统一?
  6. 洛谷p1338末日的传说(思维好题,数学)
  7. java 链表两数相加
  8. 一款PC端抖音去水印工具V1.86
  9. android蓝牙历史发送记录,蓝牙发送历史记录
  10. 计算机联锁论文开题报告,学生论文开题报告评语
  11. Android关键字persistent
  12. 【敏捷团队】7.敏捷最后冲刺
  13. pdf文件怎么编辑,如何修改pdf文字
  14. Python数据分析案例-利用多元线性回归与随机森林回归算法预测笔记本新品价格
  15. xampp 可道云_Windows下用kodexplorer可道云在本地搭建私有云的步骤
  16. php删除bom,php bom如何去掉
  17. jenkins定时任务时间设置方法
  18. win10系统怎么把默认浏览器edge切换成IE模式
  19. 2021高考江门成绩查询,2021江门中考成绩查询时间及入口
  20. css3实现非矩形图片效果

热门文章

  1. 常见的开源协议有哪些
  2. EVE-NG问题解决方法
  3. 高光谱数据之多元散射校正
  4. 做智能硬件要考虑的产品生命周期
  5. vxlan Virtual eXtensible Local Area Networking
  6. 苹果开发者apple_developer_api
  7. html计算斐波那契数列,使用HTML5 Web Worker计算斐波那契数列
  8. 二叉树遍历及遍历性质
  9. 9种简单的方法来使用社交媒体SEO
  10. 重磅发布!西骏数据与华为云GaussDB完成兼容互认证