8. QT_OpenGL--1. 在QtWidget中搭建OpenGL加载框架

news2024/9/20 18:41:06

1. 说明:

在 Qt 中使用 OpenGL,实际上时严格遵循一种代码开发框架的,在 QtWidget 中,需要使用 openGlWidget 控件,并自定义类,类中还需继承 QOpenGLWidget,QOpenGLFunctions_3_3_Core 两个类,并将 openGlWidget 控件提升为我们自定义的类,才能正常显示图形,本文将介绍最基本的框架搭建,后续即可在这个框架中不断添加代码进行 OpenGL 的深入学习。

2. 步骤一:

首先创建一个 Qt Widget Application 工程,继承自 QMainWindow,工程名称命名为 LearnOpenGL,之后在设计师页面中,添加一个 OpenGlWidget 小控件,如下图所示:
在这里插入图片描述
并将主窗口的样式设置一下,以便进行区分(可不设置),如下图所示:
在这里插入图片描述
对应 styleSheet 的代码如下:

QWidget{
		background-color:rgb(121,121,121);
		color:rgb(255,255,255);
		font:10pt "幼圆";
}
QMenuBar{
		background-color:rgb(200,200,200);
		color:rgb(60,60,60);
}

3. 步骤二:

之后,需要自定义一个类,此后所有与 OpenGL 相关的代码都会在这个类中进行实现,本文命名为 MyOpenGlWidget,此类需要同时继承 QOpenGLWidget,QOpenGLFunctions_3_3_Core,并重写 QOpenGLWidget 类中的三个虚函数,virtual void initializeGL(); virtual void resizeGL(int w, int h); virtual void paintGL(); 对应代码如下:
MyOpenGlWidget.h:

#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H

#include <QObject>
#include <QWidget>

#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>

class MyOpenGLWidget : public QOpenGLWidget,QOpenGLFunctions_3_3_Core
{
    Q_OBJECT
public:
    explicit MyOpenGLWidget(QWidget *parent = nullptr);

protected:
    virtual void initializeGL() override;
    virtual void resizeGL(int w, int h) override;
    virtual void paintGL() override;

signals:

};
#endif // MYOPENGLWIDGET_H

MyOpenGlWidget.cpp:

#include "myopenglwidget.h"

MyOpenGLWidget::MyOpenGLWidget(QWidget *parent) :  QOpenGLWidget(parent)
{

}

void MyOpenGLWidget::initializeGL()
{
	//必须在 initializeGL() 函数中加入下面一行代码,否则无法显示图形
    initializeOpenGLFunctions();
}

void MyOpenGLWidget::resizeGL(int w, int h)
{

}

void MyOpenGLWidget::paintGL()
{
    /* 后面所有与绘图相关的代码都会写在 paintGL() 函数中 */
	//使用某种颜色填充窗口
    glClearColor(0.5f,0.9f,0.4f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
}

4. 步骤三:

将上面在设计师窗口中添加的 openGLWidget 控件提升为自定义的类 MyOpenGLWidget,如下图所示:(在①处写入自定义类的名称,点击②的Add,确保③处打上√)
在这里插入图片描述

4. 步骤四:

运行程序,如果页面呈现草绿色,说明加载成功,如下图所示:里面没有任何图形,因为还没有在 paintGL()函数中添加代码,目前只是更改了背景颜色,后续的代码会在此框架上逐渐添加。
在这里插入图片描述

持续更新中,请大家多多关注…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/343769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Word控件Spire.Doc 【Table】教程(14): 如何在C#中为word表格设置AutoFit选项

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

【沁恒WCH CH32V307V-R1的单线半双工模式串口通讯】

【沁恒WCH CH32V307V-R1的单线半双工模式串口通讯】1. 前言2. 软件配置2.1 安装MounRiver Studio3. UASRT项目测试3.1 打开UASRT工程3.2 编译项目4. 下载验证4.1 接线4.2 演示效果5. 小结1. 前言 该模块包含 3 个通用同步异步收发器&#xff08;USART1/2/3&#xff09;和 5 个通…

vivo 自研Jenkins资源调度系统设计与实践

作者&#xff1a;vivo 互联网服务器团队- Wu Qinghua 本文从目前业界实现Jenkins的高可用的实现方案&#xff0c;分析各方案的优缺点&#xff0c;引入vivo目前使用的Jenkins高可用方案&#xff0c;以及目前Jenkins资源的调度方案的设计实践和目前的落地运行效果。 一、前言 现…

微服务实战--高级篇:分布式事务seata

分布式事务 1.分布式事务问题 1.1.本地事务 本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff1a; 1.2.分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c…

PPP协议

PPP协议PPP协议概述PPP链路建立过程PPP链路接口状态机LCP报文格式LCP协商过程—正常协商&#xff08;链路层协商过程&#xff09;LCP协商过程—参数不匹配&#xff08;链路层协商过程&#xff09;LCP协商过程—参数不识别&#xff08;链路层协商过程&#xff09;PPP认证模式PAP…

vTESTstudio - VT System CAPL Functions - General/Trigger Function

前面文章中我们已经介绍了常用的几种板卡的基本信息&#xff0c;那这些板卡该如何去通过软件调用呢&#xff1f;带着这个问题我们开始新的一块内容 - VT系统相关的自动化控制函数介绍&#xff0c;我会按照不同的板卡来分类&#xff0c;对其可控制的函数进行介绍&#xff0c;方便…

快速理解 JVM 原理 - 【基础概念篇】

快速理解 JVM 原理 - 【基础概念篇】 Java虚拟机 是什么&#xff1f; Java 虚拟机 本质就是一台”虚拟的“计算机 &#xff0c;大家通俗的理解是一款 “软件”安装在电脑上 虚拟机通常分为两类&#xff1a; 系统虚拟机【可运行完整操 作系统的软件平台】程序虚拟机 【为执行…

AA-PEG-AA,Acetic Acid-PEG-Acetic Acid,羧酸-聚乙二醇-羧酸供应

英文名称&#xff1a;Acetic Acid-PEG-Acetic Acid&#xff0c;AA-PEG-AA 中文名称&#xff1a;羧酸-聚乙二醇-羧酸 AA-PEG-AA是一种线性双功能PEG羧酸试剂。PEG和COOH基团之间存在亚甲基&#xff08;CH2&#xff09;键。AA-PEG-AA也称为CM-PEG-CM&#xff0c;CM&#xff1a;…

【GD32F427开发板试用】使用TinyMaix进行手写数字识别

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;xusiwei1236 一、TinyMaix简介 TinyMaix是国内sipeed团队开发一个轻量级AI推理框架&#xff0c;官方介绍如下&#xff1a; TinyMaix 是面向单…

django+mysql实现一个简单的web登录页面

目录 一、使用pyacharm创建一个django项目 二、启动django项目验证 三、配置mysql数据库 1、本地安装mysql数据库 1&#xff09;安装mysql数据库 2&#xff09;自己创建一个数据库 2、安装 pymysql 3、配置mysql数据库 1&#xff09;在项目同名包下的_init_.py里面添加…

OpenGL渲染管线介绍

一、概述 OpenGL是跨平台计算机图形应用程序的应用规范&#xff0c;广泛应用于仿真、游戏、GIS系统等领域&#xff0c;实现二三维图形的渲染。OpenGL渲染过程需要经历CPU、GPU两个阶段&#xff0c;CPU中进行图形计算&#xff0c;完成之后调用OpenGL开发接口在GPU中创建缓存区缓…

前后端一些下载与配置(第二篇 第10天过后)nuxt banner redis

NUXT 应该是不用怎么装&#xff1f; 有现成的 axios 还需要在npm吗 好像已经有现成的了 banner banner 笔记汇总P396 Redis Linux安装redis tar -xzvf redis-6.2.6.tar.gz cd redis-6.2.6 照着他做 然后 cd /usr/local/redis/bin ./redis-server /usr/local/redis…

图数据建模基础

Neo4j 图的组件 节点&#xff08;Nodes&#xff09;标签&#xff08;Labels&#xff09;关系&#xff08;Relationships&#xff09;属性&#xff08;Properties&#xff09;建模过程 了解领域并为应用程序定义特定用例&#xff08;问题&#xff09;。开发初始图形数据模型。 对…

ansible的剧本(playbook)

一、playbooks 概述以及实例操作 1、playbooks 的组成 playbooks 本身由以下各部分组成 &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 &#xff08;2&#xff09;Variables&#xff1…

多模式支持无线监控技术:主动式定位、被动式定位

物联网空间信息与数字技术发展至今&#xff0c;已经催生了一大批优秀的践行者。在日常与商业应用中&#xff0c;室内外定位领域依托于这一技术的发展&#xff0c;更是在近几年风光无限。但是并不是说室内定位与室外定位都已经相当成熟&#xff0c;相对来说&#xff0c;室内定位…

简单实用的内网穿透实现教程

内网穿透&#xff0c;字面理解就是网络地址穿透&#xff0c;是一种比较常用的将内网地址转换成公网地址的方式。通过内网穿透&#xff0c;可以将本地内网局域网提供给外网公网上访问&#xff0c;在外网也能连接访问内网主机和应用&#xff0c;当用户有日常远程和异地外网访问的…

Zabbix的自定义监控

Zabbix的自定义监控 zabbix自动可以提供很多监控项&#xff1b;但是往往不能满足需求&#xff1b;尝尝需要我们自己创建一系列的监控项&#xff0c;这就是自定义监控&#xff1b; 监控项&#xff1a;zabbix进行监控的一个指标&#xff0c;zabbix成为item&#xff1b; 它的值…

C++7:STL-模拟实现vector

目录 vector的成员变量 构造函数 reserve size() capacity() push_back 一些小BUG 赋值操作符重载 析构函数 【】操作符重载 resize pop_back Insert 迭代器失效 erase 二维数组问题 总结一下 vector&#xff0c;翻译软件会告诉你它的意思是向量&#xff0c;但其…

面试腾讯测开岗,结束后被面试官吐槽“什么阿猫阿狗都敢来面试大厂了吗?”.....

前一阵子有个小徒弟向我诉苦&#xff0c;说自己在参加某大厂测试面试的时候被面试官怼得哑口无言&#xff0c;场面让他一度十分尴尬 印象最深的就是下面几个问题&#xff1a; 根据你以前的工作经验和学习到的测试技术&#xff0c;说说你对质量保证的理解&#xff1f; 非关系型…

不连接显示器或者HDMI欺骗器来 使用Moonlight串流游戏

环境&#xff1a;WIN11NVIDIA显卡Moonlight串流 问题&#xff1a;当主机不连接显示器时&#xff0c;Moonlight客户端黑屏 解决办法&#xff1a;使用虚拟显示器来使显卡工资 背景&#xff1a;当SteamDeck 大卖的时候&#xff0c;我开始思考是否也需要购买一台Steam Deck来躺在床…