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窗口的创建相关推荐
- QT中OpenGL开发起步
OpenGL中环境搭建 近期由于需要做一个GUI展示的OpenGL程序,因此想到用QT来做界面,需要在QT中写OpenGL,配完环境后,在这里总计一下. QT基础 总体看来,QT的版本较为混乱,有时候 ...
- Qt中另一种创建线程的方式
文章目录 1 Qt中另一种创建线程的方式 1.1 另一种创建线程的方式 1.2 同步型线程的设计 1.3 异步型线程的设计 1 Qt中另一种创建线程的方式 1.1 另一种创建线程的方式 历史的痕迹: ...
- 在Qt中使用C++代码创建界面
好儿郎~志在四方 Qt视频教程地址:http://space.bilibili.com/84360636/#!/index 目录视图 摘要视图 订阅 图灵赠书--程序员11月书单 [思考]Pyt ...
- QT中关于窗口全屏显示与退出全屏的实现
近期在学习QT时遇到了很多问题这也是其中一个,个人通过在各种书籍和网络上的查阅找到了一些关于这方面的答案,希望能给大家一些帮助. 首先,在QT中对于窗口显示常用的有这么几个方法可以调用: Qt全屏显示 ...
- qt中设置窗口左上角的图标
前面一节已经详细的讲解了怎么添加图片到qt的图片资源文件中,这里就不赘述了,不太了解的可以看看博主的这篇随笔:qt中建立图片资源管理文件 this->setWindowIcon(QIcon(&q ...
- QT中父子窗口事件传递与事件过滤器
处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...
- Qt中设置窗口边框的圆形
Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口. 下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this ...
- qt中关闭窗口资源释放问题
针对QDialog对象,如果是栈上分配的,就不存在资源泄漏问题,但是当对象是new出来的,并且以局部对像存在,当关闭时,窗口只是隐藏,资源是没有释放的,每次exec后者需要delete来释放,另外一种 ...
- qt中拖动窗口widget
提要 继承与QDialog的窗口,窗口原本按住标题栏可以拖动窗口,但是设置了窗口的隐藏标题栏属性后,窗口不再能够拖动.或者继承于QWidget的窗体,不具有窗口拖动功能. 本文实现继承于窗口widge ...
最新文章
- 谷歌浏览器实现按下按键的脚本_chrome浏览器控制台创建js脚本并执行
- R语言使用pROC包在同一图中绘制两条ROC曲线并通过假设检验检验ROC曲线的AUC或者偏AUC的差异(输出p值)
- 《Web前端开发精品课 HTML与CSS进阶教程》——1.4 id和class
- 现代计算机系统中运算器设计一般采用的是,全国2014年4月高等教育自学考试计算机原理试题课程代码:02384...
- 如何将多个PDF合成为一个PDF,并且大小统一?
- 洛谷p1338末日的传说(思维好题,数学)
- java 链表两数相加
- 一款PC端抖音去水印工具V1.86
- android蓝牙历史发送记录,蓝牙发送历史记录
- 计算机联锁论文开题报告,学生论文开题报告评语
- Android关键字persistent
- 【敏捷团队】7.敏捷最后冲刺
- pdf文件怎么编辑,如何修改pdf文字
- Python数据分析案例-利用多元线性回归与随机森林回归算法预测笔记本新品价格
- xampp 可道云_Windows下用kodexplorer可道云在本地搭建私有云的步骤
- php删除bom,php bom如何去掉
- jenkins定时任务时间设置方法
- win10系统怎么把默认浏览器edge切换成IE模式
- 2021高考江门成绩查询,2021江门中考成绩查询时间及入口
- css3实现非矩形图片效果