《QT+OpenGL学习之我见(1)》初始化窗口及三个重要函数 -by zobol
liebian365 2024-10-20 09:53 28 浏览 0 评论
本章前言:本章讲如何利用VS和QT来创建一个基本的QOpenGLWidget窗口和有关联的三个核心函数,因为版本更新可能会有大同小异,但基本的不会有变换,有了QT的帮助,我们不需要下载opengL、glsl、cmake只需要下载一个qt和使之跟vs链接的小插件即可,注意在下载qt的时候,记得按照opengl模块(虽然这个模块免费了,但是qt官网并没有默认放入核心三模块中)。
作者:本教程是我基于github上著名的learnopengl教学https://learnopengl-cn.github.io/和opengl官网https://www.khronos.org/opengl制作的个人opengl教学笔记。之所以选择Qt作为辅助,是因为qt中集成了opengl开发,让我们省去了很多原版opengl不必要的兼容操作和处理,可以把精力更好的放到图形开发上,个人能力有限,如有不足,请多指教。
开发环境:opengl+qt+vs2017+win10
(所有源代码全部开源公开,并且可以在我的个人公众号:zobol的魔法藏书室和博客https://github.com/zobolBlog/LearnOpenGLWithQT下载)
个人制作视频教程:https://www.bilibili.com/video/BV1X5411w7QV/
个人技术博客:https://zobolblog.github.io/LearnOpenGLWithQT/Doc/01.html
1.新建项目,选择GUI Application (新版的名字略有修改,但是只要选择带GUI的就可以了)
2.添加对应模块opengl、opengl extension(新版把debug和release分开了,无妨)
3.选择QWidget作为继承基类,这是qt官方推荐的QOpenGLWidget就是使用QWidget作为父类的。
其余保持不变即可
4.创建QWidget项目完成,看一下项目栏,有没有疏漏。
编译之后,正常显示窗口,就是正常。
5.替换父类,将QWidget替换成QOpenGLWidget,一共两处
6.添加对应头文件,两个。其中关于opengl版本的文件,至少要填到3.3之后(这之后opengl的版本更新都变化不大)。
类QOpenGLFunctions_x_x_Core是对OpenGL某个版本的包装器,这样就可以使用原版函数,如果不写,我们就只能用qt封装的另外一套函数,也可以用但是跟learnopengl教程不一样。
因为都是向下兼容型,选择3.3版本之后,你的计算机能带动的就行。
7.三个关键函数,QOpenGLWidget都制作成保护函数,都需要我们去继承,重新实现。
8.在源代码中继承,并实现。
virtual void initializeGL();//负责初始化,就是缓冲对象vao、vbo、ebo、着色器、纹理、摄像机。
virtual void resizeGL(int w, int h);//视图、窗口大小改变,自动调用
virtual void paintGL();//画,渲染一次。循环要添加update()函数
9.initializeGL()函数,负责初始化,就是缓冲对象vao、vbo、ebo、着色器、纹理、摄像机。
This virtual function is called once before the first call to paintGL() or resizeGL(). Reimplement it in a subclass.This function should set up any required OpenGL resources and state.
There is no need to call makeCurrent() because this has already been done when this function is called. Note however that the framebuffer is not yet available at this stage, so avoid issuing draw calls from here. Defer such calls to paintGL() instead.
10.resizeGL(int w, int h)函数,/视图、窗口大小改变,自动调用
This virtual function is called whenever the widget needs to be painted. Reimplement it in a subclass.There is no need to call makeCurrent() because this has already been done when this function is called.
Before invoking this function, the context and the framebuffer are bound, and the viewport is set up by a call to glViewport(). No other state is set and no clearing or drawing is performed by the framework.
11.paintGL()函数画,渲染一次。循环要添加update()函数
Sets the requested surface format.When the format is not explicitly set via this function, the format returned by QSurfaceFormat::defaultFormat() will be used. This means that when having multiple OpenGL widgets, individual calls to this function can be replaced by one single call to QSurfaceFormat::setDefaultFormat() before creating the first widget.
12. 在cpp文件中修改一下,paintGL函数的内容。
13.结果,看见一个黑色框框就是正确的QOpenGLWidget窗口。
源代码:
HelloOpenGL.h:
#include <QtWidgets/QWidget>
#include "ui_HelloOpenGL.h"
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
class HelloOpenGL : public QOpenGLWidget
{
Q_OBJECT
public:
HelloOpenGL(QWidget *parent = Q_NULLPTR);
protected:
virtual void initializeGL();//负责初始化,就是缓冲对象vao、vbo、ebo、着色器、纹理、摄像机。
virtual void resizeGL(int w, int h);//视图、窗口大小改变,自动调用
virtual void paintGL();//画,渲染一次。循环要添加update()函数
private:
Ui::HelloOpenGLClass ui;
};
HelloOpenGL.cpp:
#include "HelloOpenGL.h"
HelloOpenGL::HelloOpenGL(QWidget *parent)
: QOpenGLWidget(parent)
{
}
void HelloOpenGL::initializeGL()
{
}
void HelloOpenGL::resizeGL(int w, int h)
{
}
void HelloOpenGL::paintGL()
{
update();
}
main.cpp:
#include "HelloOpenGL.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
HelloOpenGL w;
w.show();
return a.exec();
}
相关推荐
- 看黑客是如何获取你电脑最高权限的,一定要看
-
在渗透过程中,通过各种方式获取到一枚cmdshell,但是这个shell的权限比较低,无法让我们做我们想要做的一些操作,比如说获取系统密码,获取数据库信息,又或者比如说拿到服务器中的另一个站点的权限,...
- 是50个常用的Visual Basic代码示例:
-
以下是50个常用的VisualBasic代码示例:1.声明变量```vb...
- 电脑系统型号怎么看版本(如何看电脑系统型号)
-
有时候我们会需要进行查看电脑上安装的windows系统版本及系统版本号,但对于不懂电脑知识的小白来说要怎么查看电脑系统版本信息呢?别着急,有小编在接下来,就将查看电脑系统版本的教程来分享给你们,希望对...
- dos命令systeminfo,查看系统启动时间。电脑卡慢,win10怎么了?
-
最近一段时间,有几个反应电脑卡慢的,都是windows10的系统。询问得知每天电脑有关机,打开任务管理器,内存使用量达到百分之九十多,而程序只打开微信、wps、360浏览器。cmd窗口运行命令syst...
- systeminfo命令:全面解析系统信息!
-
你是否曾想过,仅凭一条简单的命令,就能深入了解计算机的"内心世界"?是不是有点不可思议?那么,让我们一起探寻这个神奇的命令,揭开它背后的奥秘吧!它能提供的信息超乎你的想象,从操作系统到硬件配置,再到驱...
- 电脑序列号怎么查询?只需两行命令一键查询
-
当我们的电脑出问题需要保修的时候,需要查询到电脑的型号和序列号才更便于进行下一步的操作,有包装盒的朋友还可以在包装盒上查询,笔记本用户可以在电脑底部标签上查询,没有包装盒和标签破损的用户就无从下手了。...
- 快速显示系统信息:Systeminfo命令详解
-
Systeminfo命令是windows系统中显示系统信息的命令,此命令可以显示出计算机的操作系统的详细配置信息,包括操作系统配置、安全信息、产品ID和硬件属性(如RAM、磁盘空间和网卡)。使用...
- dos命令systeminfo图文教程,显示操作系统配置信息msinfo32
-
大家好,我是老盖,首先感谢观看本文,本篇文章做的有视频,视频讲述的比较详细,也可以看我发布的视频。今天我们学习systeminfo命令,该工具显示本地或远程机器(包括服务包级别)的操作系统配置的信息,...
- 基于uniapp+vue3跨端仿制chatgpt实例uniapp-chatgpt
-
#夏日生活打卡季#...
- 原创新作uniapp+vue3+pinia2高仿微信App聊天
-
前段时间有给大家分享一个flutter3.x桌面端os系统。今天再分享一款最新原创之作uniapp-vue3-wechat聊天实例。uni-vue3-wechat采用...
- UniApp开发的设备适配(uniapp服务器配置)
-
UniApp是一个跨平台开发框架,支持多端应用(如H5、小程序、iOS、Android等)。由于不同设备的屏幕尺寸、分辨率、操作系统等存在差异,设备适配是开发过程中需要重点关注的问题。以下是Uni...
- 如何用服务器搭建自己的个人网站(自己服务器怎么做网站)
-
这篇教程主要是告诉大家如何利用TCP和HTTP协议来完成网站的搭建。首先你需要有C/C++语言基础,且有服务器、客户端概念,如果你了解TCP或者HTTP协议的话,那么将会帮助你更快的学会如何搭建个人网...
- 大话C语言:字符数组(c语言字符数组教学视频)
-
1字符数组概述C语言中没有字符串这种数据类型,可以通过char的数组来替代。数字0(和字符'\0'等价)结尾的char数组就是一个字符串,字符串是一种特殊的char的数组。...
- 源码分享:在pdf上加盖电子签章(pdf怎么加电子签章)
-
在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...
- C语言wcstombs函数详解:宽字符字符串到多字节的「翻译官」
-
核心定位wcstombs是C语言中用于将宽字符字符串转换为多字节字符串的「翻译官」,它能将宽字符(wchar_t)转换为多字节字符(如UTF-8编码的中文)。就像一位翻译官,它能将一种语言(宽字符...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)