06——qt opengl 立方体 ebo 贴图

2023-11-13

qmyopenglwidget.h

#ifndef QMYOPENGLWIDGET_H
#define QMYOPENGLWIDGET_H

#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLShaderProgram>

class QMyOpenglWidget : public QOpenGLWidget, QOpenGLFunctions_3_3_Core
{
public:
    enum EType {
        eNone,
        eFull,
        eLine,
        ePoint,

    };

    Q_OBJECT
public:
    explicit QMyOpenglWidget(QWidget* parent = nullptr);

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

public:
    void cretaeShader();
    void initDrawData(GLuint &vao, float *vertices, int vSize, GLuint &ebo);
    void modeChange(EType type = eLine);
    unsigned int setImage(const char *filename);

private:
    unsigned int vao1;
    unsigned int ebo1;
    QOpenGLShaderProgram program;

    GLuint programId;
    GLint mLocation;
    GLint vLocation;
    GLint pLocation;

    GLint vertexLocation;
    GLint colorLocation;
    GLint uvLocation;

    QMatrix4x4 mMatrix;
    QMatrix4x4 vMatrix;
    QMatrix4x4 pMatrix;

    unsigned int texture0;


signals:

public slots:


};

#endif // QMYOPENGLWIDGET_H

qmyopenglwidget.cpp

#include "qmyopenglwidget.h"
#include <QGLWidget>

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

}

void QMyOpenglWidget::initializeGL()
{
    initializeOpenGLFunctions();

    cretaeShader();

    //三角形顶点坐标
    float s = 2.0f/2;
    GLfloat vertices[] = {
        -s, -s, -s,
         s, -s, -s,
         s, -s,  s,
        -s, -s,  s,
        -s,  s, -s,
         s,  s, -s,
         s,  s,  s,
        -s,  s,  s,

        -s, -s, -s,
        -s, -s,  s,
        -s,  s,  s,
        -s,  s, -s,

         s, -s, -s,
         s, -s,  s,
         s,  s,  s,
         s,  s, -s,


    };

    initDrawData(vao1, vertices, sizeof(vertices), ebo1);

    glEnable(GL_CULL_FACE); //启动了背面裁剪
    glFrontFace(GL_CCW); //设置逆时针为正面
}

void QMyOpenglWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);
    pMatrix.setToIdentity();
    float aspect = float(w*1.0)/ float(h);
    //printf("aspect = %f \n", aspect);
    qDebug()<<"aspect = "<<aspect<<" resizeGL";
    //aspect = int(aspect * 100) / 100.0f;
    //aspect = 1.42857f;
    pMatrix.perspective(45.0f, aspect, 0.000f, 100.f);
    //pMatrix.ortho(0, 0 , w, h, 0, 100);
    vMatrix.lookAt(QVector3D{0.0,0.0,-1.0}, QVector3D{0.0,0.0,1.0},QVector3D{0.0,1.0,0.0});
    mMatrix.setToIdentity();
    mMatrix.translate(QVector3D{0.0,0.0,3.0});

    mMatrix.rotate(-30, QVector3D{1.0,0.0,0.0});
    update();
}

void QMyOpenglWidget::paintGL()
{
    //qDebug()<<" paintGL";
    glClearColor(0.2f, 0.2f, 0.1f, 0.1f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUniformMatrix4fv(mLocation, 1, GL_FALSE, mMatrix.data());
    glUniformMatrix4fv(vLocation, 1, GL_FALSE, vMatrix.data());
    glUniformMatrix4fv(pLocation, 1, GL_FALSE, pMatrix.data());

    //glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture0);

    mMatrix.rotate(1, QVector3D{0.0,1.0,0.0});

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ebo1);
    glBindVertexArray(vao1);

    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, nullptr);
    //glDrawArrays(GL_TRIANGLES, 0, 36);

    update();

    //draw(eLine);
}

void QMyOpenglWidget::cretaeShader()
{
    program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertex.vert");
    program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/frag.frag");
    program.bind();
    program.link();

    programId = program.programId();
    mLocation = glGetUniformLocation(programId, "mMatrix");
    vLocation = glGetUniformLocation(programId, "vMatrix");
    pLocation = glGetUniformLocation(programId, "pMatrix");
    vertexLocation = glGetAttribLocation(programId, "pos");
    colorLocation = glGetAttribLocation(programId, "color");
    uvLocation = glGetAttribLocation(programId, "uv0");


    Q_ASSERT(mLocation != -1);
    Q_ASSERT(vLocation != -1);
    Q_ASSERT(pLocation != -1);
    Q_ASSERT(vertexLocation != -1);
    Q_ASSERT(colorLocation != -1);
}

void QMyOpenglWidget::initDrawData(GLuint &vao, float *vertices, int vSize, GLuint &ebo)
{


    //顶点索引
    GLuint indexs[] = {
        //0, 3, 4, 3, 7, 4, // 左 ADHE
        //1, 6, 2, 1, 5, 6, // 右 BCGF
        0, 5, 1, 0, 4, 5, // 前 ABFE
        2, 7, 3, 2, 6, 7,  // 后 DCGH
        7, 5, 4, 7, 6, 5, // 上 EFGH
        0, 1, 3, 1, 2, 3, // 下 ABCD

        8, 9, 11, 9, 10, 11, // 左 ADHE
        12, 14, 13, 12, 15, 14, // 右 BCGF


    };



    GLfloat uv[] = {0, 0,
                    1, 0,
                    1, 1,
                    0, 1,
                    0, 1,
                    1, 1,
                    1, 0,
                    0, 0,

                    0, 0,
                    1, 0,
                    1, 1,
                    0, 1,
                    0, 1,
                    1, 1,
                    1, 0,
                    0, 0,

                    };


    //顶点点颜色
    GLfloat colors[] = {  1.0f, 0.0f, 0.0f,1.0f ,  //红
                         0.0f, 1.0f, 0.0f ,1.0f ,  //绿
                         0.0f, 0.0f, 1.0f ,1.0f ,  //蓝
                         0.0f, 0.0f, 0.0f ,1.0f ,  //白
                          1.0f, 0.0f, 0.0f,1.0f ,  //红
                           0.0f, 1.0f, 0.0f ,1.0f ,  //绿
                           0.0f, 0.0f, 1.0f ,1.0f ,  //蓝
                           0.0f, 0.0f, 0.0f ,1.0f ,  //白

                          1.0f, 0.0f, 0.0f,1.0f ,  //红
                           0.0f, 1.0f, 0.0f ,1.0f ,  //绿
                           0.0f, 0.0f, 1.0f ,1.0f ,  //蓝
                           0.0f, 0.0f, 0.0f ,1.0f ,  //白
                            1.0f, 0.0f, 0.0f,1.0f ,  //红
                             0.0f, 1.0f, 0.0f ,1.0f ,  //绿
                             0.0f, 0.0f, 1.0f ,1.0f ,  //蓝
                             0.0f, 0.0f, 0.0f ,1.0f ,  //白
                       };


    //**************vao******************************//
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    //******************* Vbo vertices*******************//
    unsigned int vbo1;
    glGenBuffers(1, &vbo1);
    glBindBuffer(GL_ARRAY_BUFFER, vbo1);
    //为当前绑定到target 的缓冲区对象创建一个新的数据存储  //
    glBufferData(GL_ARRAY_BUFFER, vSize, vertices, GL_STATIC_DRAW);
    //告知显卡如何解析缓冲区里的属性值
    glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, FALSE, 3*sizeof (GL_FLOAT), nullptr);
    //开启VAO管理的第一个属性
    glEnableVertexAttribArray(vertexLocation);

    //************** Vbo color**************************/
    unsigned int vboColor;
    glGenBuffers(1, &vboColor);
    glBindBuffer(GL_ARRAY_BUFFER, vboColor);
    //为当前绑定到target 的缓冲区对象创建一个新的数据存储  //
    glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
    //告知显卡如何解析缓冲区里的属性值
    glVertexAttribPointer(colorLocation, 4, GL_FLOAT, FALSE, 4*sizeof (GL_FLOAT), nullptr);
    //开启VAO管理的第一个属性
    glEnableVertexAttribArray(colorLocation);


    glUniform1i(glGetUniformLocation(programId, "texture0"), 0);
    texture0 = setImage(":/n.jpg");


    //************** Vbo UV**************************/
    unsigned int vboUv;
    glGenBuffers(1, &vboUv);
    glBindBuffer(GL_ARRAY_BUFFER, vboUv);
    //为当前绑定到target 的缓冲区对象创建一个新的数据存储  //
    glBufferData(GL_ARRAY_BUFFER, sizeof(uv), uv, GL_STATIC_DRAW);
    //告知显卡如何解析缓冲区里的属性值
    glVertexAttribPointer(uvLocation, 2, GL_FLOAT, FALSE, 2*sizeof (GL_FLOAT), nullptr);
    //开启VAO管理的第一个属性
    glEnableVertexAttribArray(uvLocation);


    //***************EBO ******************************/
    glGenBuffers(1, &ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof (indexs), indexs, GL_STATIC_DRAW);
}

unsigned int QMyOpenglWidget:: setImage(const char *filename)
{
    QImage image = QImage(filename);
    image = QGLWidget::convertToGLFormat(image); //格式转换

    unsigned int texture;
    glGenTextures(1, &texture);
    //glActiveTexture(textureNum);
    glBindTexture(GL_TEXTURE_2D, texture);

    // set the texture wrapping/filtering options (on the currently bound texture object)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    // load and generate the texture
    int width, height, nrChannels;
    width = image.width();
    height = image.height();
    nrChannels = image.depth();
    Q_ASSERT(width>0 && height > 0);
    //unsigned char *data = stbi_load("container.jpg", &width, &height, &nrChannels, 0);
    if (image.bits())
    {
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
        glGenerateMipmap(GL_TEXTURE_2D);
    }
    else
    {
        //std::cout << "Failed to load texture" << std::endl;
        Q_ASSERT(0);
    }


    return texture;

}

void QMyOpenglWidget::modeChange(QMyOpenglWidget::EType type)
{
    makeCurrent(); //设置当前opengl 渲染环境
    switch(type)
    {
        case eLine: {glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); break;}
        case eFull: {glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); break;}
        case ePoint: {glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); break;}
        default: {glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); break;}
    }


    //glBindVertexArray(vao1);
    //glDrawArrays(GL_TRIANGLES, 0, 3);
    update();
    doneCurrent();
}

vertex.vert

#version 330 core
uniform mat4 pMatrix;
uniform mat4 vMatrix;
uniform mat4 mMatrix;
in vec3 pos;
in vec4 color;
in vec2 uv0;
out vec4 fcolor;
out vec2 TexCoord0;
void main(void)
{
    fcolor = color;
    gl_Position = pMatrix  * vMatrix * mMatrix * vec4(pos, 1.0);
    TexCoord0 = uv0;
}

frag.frag

#version 330 core
in vec4 fcolor;
out vec4 FragColor; //片段着色器输出
in vec2 TexCoord0;
uniform sampler2D texture0;
void main(void)
{
    FragColor = fcolor*0.3 +  texture2D(texture0, TexCoord0);
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

06——qt opengl 立方体 ebo 贴图 的相关文章

  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • QWebView等待加载

    bool MainWindow waitForLoad QWebView view QEventLoop loopLoad QTimer timer QObject connect view SIGNAL loadFinished bool
  • 移动/调整大小期间 opengl 窗口冻结

    我正在使用 LWJGL 开发游戏 移动窗口时 计划将来添加调整大小代码 渲染循环冻结 我希望它在移动时继续以某种方式运行 LWJGL 不包括 glutMainLoop Display属于OpenGL 而不是Java 相关代码 regular
  • Windows下使用GLEW使用OpenGL扩展

    我一直在 Windows 上使用 OpenGL 扩展痛苦的方式 https stackoverflow com questions 14413 using opengl extensions on windows GLEW 是更简单的方法吗
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 在 Qt 中构建 Android 项目不再有效

    所以我对 Android SDK NDK 和 Apache Ant 进行了一些更新 现在我无法构建任何 Android 项目 我收到一条警告 然后它说找不到 build xml 文件 错误 Warning Android platform
  • 在 Qt 中用像素图画笔画一条线?

    一段时间以来 我正在使用 Qt C 开发一个简单的绘图和绘画应用程序 目前我正在使用 QPainter drawLine 进行绘制 并且工作正常 我想做的是用像素图画笔绘图 这是我可以做到的 我可以使用 QPainterPath 和 QPa
  • 为什么我的 CAOpenGLLayer 更新速度比之前的 NSOpenGLView 慢?

    我有一个在 Mac OS X 上渲染 OpenGL 内容的应用程序 最初它渲染到 NSOpenGLView 然后我将其更改为渲染到 CAOpenGLLayer 子类 当我这样做时 我看到了巨大的性能损失 帧速率减半 鼠标响应能力降低 卡顿
  • QListWidget 拖放项目从 Symbian 列表中消失

    我在实现带有可通过拖放重新排序的自定义项的 QListWidget 时遇到问题 问题是当我在某个项目上快速双击 非常短的拖放 时 该项目有时会从 QListWidget 中消失 这是我的小部件的构造函数 ListPopisiDragDrop
  • Qt - 等待 Qprocess 完成

    我正在使用 CMDQProcess但我有一个问题 My code QProcess process process start cmd exe process write del f b txt n r process waitForFin
  • GLSL聚光投影体积

    在我的开源项目中 我使用 Qt3D 设置了延迟渲染管道 到目前为止一切顺利 但现在我想通过添加聚光灯投影量来继续前进 例如场景中好像有烟雾 像这样 我正在使用的片段着色器位于问题的末尾 我读过 对于每个片段 我应该从光位置进行光线行进并找到
  • { Qt5.0.2/QML/QtQuick2.0/C++ } 运行没有错误的示例项目? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的设置是Qt5 0 2 MinGW 32位 我在寻找 Qt5 0 2 QML QtQuick2 0 C 代码项目示例 不是Qt Qu
  • 派生类在 PySide (Qt/PyQt) 中的错误线程中接收信号

    我在让派生类在 PySide 中正确接收信号时遇到问题 我在主 GUI 或命令行应用程序 线程的两个单独线程上使用发送器和接收器 线程是 QThread 对象 发送器和接收器在创建后立即使用 QObject moveToThread 移动到
  • 创建并使用我自己的纹理图集的 mipmap

    我目前正在使用自动 mipmap 生成 C OpenTK GL GenerateMipmap GenerateMipmapTarget Texture2D 我使用的纹理平铺为 16px 的块 所以我的问题是 是否可以使用不会缩小至 1x1
  • 带 Qt 的菜单栏/系统托盘应用程序

    我是 Qt PyQt 的新手 我正在尝试制作一个应用程序 其功能将从菜单栏 系统托盘执行 这里展示了一个完美的例子 我找不到关于如何做到这一点的好资源 有人可以建议吗 Thanks 我认为您正在寻找与QMenu and QMainWindo
  • 通过CMake实现Qt项目

    我正在尝试通过 Cmake 构建并运行非常简单且基本的 Qt 示例 删除 pro 文件 以下是Qt项目的代码 自动生成的Qt项目的目录结构为 Cmake my project name headers mainwindow h source
  • 如何为 glDrawElements() 指定每个图元的颜色

    我想渲染一个索引几何体 所以 我有一堆顶点和关联的排序索引 我在用glDrawElements 渲染 2 个四边形 如下所示 现在 我知道我可以使用glColorPointer 用于指定每个顶点的颜色 我的问题是 我可以指定吗每个基元的颜色
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo

随机推荐

  • 【matplotlib】可视化解决方案——如何向图表中添加数据表

    概述 虽然 matplotlib 主要用途是绘图 但是他还是可以在绘图时帮助我们做一些其他事务 比如在图表旁边放置一个整齐的数据表格 我们必须明白为数据绘制可视化图形主主要是是为了解释那些不能理解的数据 将一些来自数据整体集合的总结性或者突
  • Pytest框架:测试用例setup和teardown

    背景 假如我们进入多个模块前 每个模块有一个用例 都要打开浏览器登录 执行完毕后 需要退出再关闭浏览器 即每次运行前都要执行登录打开 退出关闭两个大量重复的操作 这些我们都可以用前置后置初始化环境去实现 怎么去实现 就是下面要介绍的 用例设
  • 【上新】手工制作马赛克瓷砖,为 Gotchiverse 添色彩!

    你无需成为艺术家即可帮助一起绘制 Gotchiverse 现在 每个人都可以用马赛克瓷砖让他们的创造力得到发挥 让我们在 Gotchiverse 中涂抹色彩吧 最新和最伟大的美学 NFT 已准备好冲击 Gotchiverse 了 介绍一下马
  • 显示this application has requested the runtime to terminate it in an unusual way.问题的简单分析

    运行程序是出现了this application has requested the runtime to terminate it in an unusual way 的异常报告 有些Win7的操作系统可能会出现此类问题 一般是软件运行时
  • LeetCode第45题解析

    给定一个非负整数数组 你最初位于数组的第一个位置 数组中的每个元素代表你在该位置可以跳跃的最大长度 你的目标是使用最少的跳跃次数到达数组的最后一个位置 示例 输入 2 3 1 1 4 输出 2 解释 跳到最后一个位置的最小跳跃数是 2 从下
  • [Java基础系列第2弹]泛型:一种提高代码复用性和灵活性的技术

    一 什么是泛型 泛型 Generics 是一种编程技术 它可以让我们在定义类 接口或方法时 使用一个或多个类型参数 Type Parameter 而不是具体的类型 这样 我们就可以在实例化或调用时 根据需要指定具体的类型 从而实现代码的复用
  • Snipaste使用手册

    功能 截屏 贴图和做笔记 使用场景举例 1 双桌面 一个是学习视频 一个是代码编辑器 截取学习视频的代码图片贴到桌面上 边看边在编辑器中敲代码 2 获取像素颜色值 3 在截屏上做笔记 and so on 常用快捷键 自定义快捷键 F1 截屏
  • CentOS 静态IP分配,提示Error, some other host already uses address解决办法

    CentOS 静态IP分配 提示Error some other host already uses address解决办法 一 第一 修改 ifup ethvi etc sysconfig network scripts ifup eth
  • 使用 Velero 备份还原 Kubernetes 集群

    Velero https velero io 可以提供备份和还原 Kubernetes 集群资源和持久卷的能力 你可以在公有云或本地搭建的私有云环境安装 Velero 可以为你提供以下能力 备份集群数据 并在集群故障的情况下进行还原 将集群
  • Nginx平滑升级记录

    因为扫描到了Nginx漏洞 所以需要对Nginx升级 同时不影响原来的nginx配置 旧版本为 nginx 1 18 0 扫描到3个漏洞 NGINX Controller 安全漏洞 CVE 2021 23017 nginx 内存损坏漏洞 C
  • models问题汇总

    1 在不卸载模块的情况下 删除model表 如想删除下表 第一步 先删除全部表属性 升级模块 第二步 再删除表及在ir model access csv中分配给ogsp phone表的权限 最后升级模块
  • Ant Design Pro从零到一(Mock使用)

    认识Mock 学到这里就算是开始踏入AntD的门 然后我们还得学习一下常用的一些操作 例如Mock 针对与Mock他大致就是用来模拟数据的 为什么会有它的出现呢 因为现在前后端开发基本是分离的 但是数据结构一般都会先定好 在日常开发中 为了
  • JavaScript在IE和Firefox下的兼容性问题

    一 问题1 获取一个元素对象的引用 在IE下 可直接使用该元素对象的id名 而在FireFox下 只能使用getElementById idName 方法 解决方法 统一用getElementById idName 问题2 获取表单元素的引
  • 你是否知道编程对孩子有多重要

    编程在大多数人的认知里都是程序员的工作 繁琐 工作强度大 理工科等 这些都是对于编程的标签 似乎与我们普通人的生活很远 你知道编程对孩子未来有多重要吗 格物斯坦小坦克来做分析 在未来编程将成为学生基础必备技能 普及程度和英语一样 我们对编程
  • jdbc手动控制事务

    在JavaBean数据库操作中 一项事务是指由一条或多条对数据库更新的sql语句所组成的一个不可分割的工作单元 只有当事务中的所有操作都正常完成了 整个事务才能被提交到数据库 如果有一项操作没有完成 就必须撤消整个事务 我们通过提交comm
  • 【MySQL】不就是多表查询综合练习

    前言 嗨咯大家好 我们学习完毕了多表查询 今天我们就要对我们所学的成果进行测验 本期主要是对多表查询相关内容的练习课程 可以先试着自己敲 遇到不会可以查看查考代码 目录 前言 目录 练习题 1 查询员工的姓名 年龄 职位 部门信息 隐式内连
  • 自学笔记-Python基础09--第三方库的概念及操作

    库 具有相关功能模块的集合 python的一大特色就是拥有强大的库 库可以分为三种 1 标准库 python自带的 无需安装直接使用 2 第三方库 由他人提供的 使用时需要先安装 3 自定义库 自己写的模块 自己用 标准库 想看python
  • react hooks 和 react-redux hooks 应用场景

    目前 Hooks 应该是 React 中最火的概念了 在阅读这篇文章之前 希望你已经了解了基本的 Hooks 是什么 下面就介绍一下简单的使用场景 react hooks useState useState是react自带的一个hook函数
  • 关于Spring的bean的相关注解以及其简单使用方法

    一 前置工作 第一步 创建一个maven项目 第二步 在resource中创建一个名字叫做spring config xml的文件 并把以下代码复制粘贴
  • 06——qt opengl 立方体 ebo 贴图

    qmyopenglwidget h ifndef QMYOPENGLWIDGET H define QMYOPENGLWIDGET H include