Qt OpenGL 3D 编程入门
Qt 提供了强大的 OpenGL 集成功能,使得在 Qt 应用中实现 3D 图形变得更加简单。以下是使用 Qt 进行 OpenGL 3D 编程的基础知识。
1. 环境配置
创建 Qt 项目
-
新建 Qt Widgets Application 项目
-
在
.pro
文件中添加 OpenGL 模块:
qmake
QT += core gui opengl
基本 OpenGL 窗口类
Qt 提供了 QOpenGLWidget
作为 OpenGL 渲染的基础组件。
openglwidget.h
#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLBuffer>
#include <QOpenGLShaderProgram>
#include <QOpenGLTexture>
#include <QTime>class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core
{Q_OBJECT
public:explicit OpenGLWidget(QWidget *parent = nullptr);~OpenGLWidget();protected:void initializeGL() override;void resizeGL(int w, int h) override;void paintGL() override;void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;void wheelEvent(QWheelEvent *event) override;private:QOpenGLVertexArrayObject vao;QOpenGLBuffer vbo{QOpenGLBuffer::VertexBuffer};QOpenGLBuffer ebo{QOpenGLBuffer::IndexBuffer};QOpenGLShaderProgram shaderProgram;QOpenGLTexture *texture;QTime time;QPoint lastMousePos;float xRot = 0.0f;float yRot = 0.0f;float zRot = 0.0f;float zoom = -5.0f;
};#endif // OPENGLWIDGET_H
2. 基本框架实现
openglwidget.cpp
#include "openglwidget.h"
#include <QDebug>
#include <QMouseEvent>
#include <QImage>OpenGLWidget::OpenGLWidget(QWidget *parent) : QOpenGLWidget(parent)
{setFocusPolicy(Qt::StrongFocus);setMouseTracking(true);time.start();
}OpenGLWidget::~OpenGLWidget()
{makeCurrent();vao.destroy();vbo.destroy();ebo.destroy();delete texture;doneCurrent();
}void OpenGLWidget::initializeGL()
{initializeOpenGLFunctions();glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glEnable(GL_DEPTH_TEST);// 立方体顶点数据 (位置 + 颜色 + 纹理坐标)float scale = 2.0f;float vertices[] = {// 前面-0.5f*scale, -0.5f*scale, 0.5f*scale, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,0.5f*scale, -0.5f*scale, 0.5f*scale, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f,0.5f*scale, 0.5f*scale, 0.5f*scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f,-0.5f*scale, 0.5f*scale, 0.5f*scale, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f,// 后面-0.5f*scale, -0.5f*scale, -0.5f*scale, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f,0.5f*scale, -0.5f*scale, -0.5f*scale, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,0.5f*scale, 0.5f*scale, -0.5f*scale, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,-0.5f*scale, 0.5f*scale, -0.5f*scale, 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f,// 左面-0.5f*scale, -0.5f*scale, -0.5f*scale, 0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,-0.5f*scale, -0.5f*scale, 0.5f*scale, 0.6f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,-0.5f*scale, 0.5f*scale, 0.5f*scale, 0.6f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,-0.5f*scale, 0.5f*scale, -0.5f*scale, 0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,// 右面0.5f*scale, -0.5f*scale, -0.5f*scale, 1.0f, 0.2f, 0.2f, 1.0f, 1.0f, 0.0f,0.5f*scale, -0.5f*scale, 0.5f*scale, 1.0f, 0.2f, 0.2f, 1.0f, 0.0f, 0.0f,0.5f*scale, 0.5f*scale, 0.5f*scale, 1.0f, 0.2f, 0.2f, 1.0f, 0.0f, 1.0f,0.5f*scale, 0.5f*scale, -0.5f*scale, 1.0f, 0.2f, 0.2f, 1.0f, 1.0f, 1.0f,// 顶面-0.5f*scale, 0.5f*scale, 0.5f*scale, 1.0f, 0.1f, 0.1f, 1.0f, 0.0f, 0.0f,0.5f*scale, 0.5f*scale, 0.5f*scale, 1.0f, 0.1f, 0.1f, 1.0f, 1.0f, 0.0f,0.5f*scale, 0.5f*scale, -0.5f*scale, 1.0f, 0.1f, 0.1f, 1.0f, 1.0f, 1.0f,-0.5f*scale, 0.5f*scale, -0.5f*scale, 1.0f, 0.1f, 0.1f, 1.0f, 0.0f, 1.0f,// 底面-0.5f*scale, -0.5f*scale, 0.5f*scale, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,0.5f*scale, -0.5f*scale, 0.5f*scale, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,0.5f*scale, -0.5f*scale, -0.5f*scale, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,-0.5f*scale, -0.5f*scale, -0.5f*scale, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f};// 索引数据保持不变unsigned int indices[] = {0, 1, 2, 2, 3, 0,4, 5, 6, 6, 7, 4,8, 9, 10, 10, 11, 8,12, 13, 14, 14, 15, 12,16, 17, 18, 18, 19, 16,20, 21, 22, 22, 23, 20};// 初始化 VAO, VBO 和 EBOvao.create();vbo.create();ebo.create();vao.bind();vbo.bind();vbo.allocate(vertices, sizeof(vertices));ebo.bind();ebo.allocate(indices, sizeof(indices));// 顶点着色器const char *vertexShaderSource = R"(#version 330 corelayout(location = 0) in vec3 aPos;layout(location = 1) in vec4 aColor;layout(location = 2) in vec2 aTexCoord;out vec4 ourColor;out vec2 TexCoord;uniform mat4 model;uniform mat4 view;uniform mat4 projection;void main(){gl_Position = projection * view * model * vec4(aPos, 1.0);ourColor = aColor;TexCoord = aTexCoord;})";// 片段着色器const char *fragmentShaderSource = R"(#version 330 corein vec4 ourColor;in vec2 TexCoord;out vec4 FragColor;uniform sampler2D texture1;void main(){vec4 texColor = texture(texture1, TexCoord);FragColor = texColor * ourColor;})";// 编译着色器shaderProgram.addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);shaderProgram.addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);if (!shaderProgram.link()) {qDebug() << "Shader Program Link Error:" << shaderProgram.log();return;}shaderProgram.bind();// 设置顶点属性指针shaderProgram.setAttributeBuffer(0, GL_FLOAT, 0, 3, 9 * sizeof(float));shaderProgram.enableAttributeArray(0);shaderProgram.setAttributeBuffer(1, GL_FLOAT, 3 * sizeof(float), 4, 9 * sizeof(float));shaderProgram.enableAttributeArray(1);shaderProgram.setAttributeBuffer(2, GL_FLOAT, 7 * sizeof(float), 2, 9 * sizeof(float));shaderProgram.enableAttributeArray(2);// 加载纹理QImage img(":/textures/test.jpeg");if (img.isNull()) {qDebug() << "Failed to load texture image!";img = QImage(2, 2, QImage::Format_RGB32);img.fill(Qt::red);}texture = new QOpenGLTexture(img.mirrored());texture->setMinificationFilter(QOpenGLTexture::Linear);texture->setMagnificationFilter(QOpenGLTexture::Linear);texture->setWrapMode(QOpenGLTexture::Repeat);shaderProgram.setUniformValue("texture1", 0);vao.release();shaderProgram.release();
}void OpenGLWidget::resizeGL(int w, int h)
{glViewport(0, 0, w, h);
}void OpenGLWidget::paintGL()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);shaderProgram.bind();vao.bind();texture->bind(0);QMatrix4x4 model;QMatrix4x4 view;QMatrix4x4 projection;model.rotate(xRot, 1.0f, 0.0f, 0.0f);model.rotate(yRot, 0.0f, 1.0f, 0.0f);model.rotate(zRot, 0.0f, 0.0f, 1.0f);view.translate(0.0f, 0.0f, zoom);projection.perspective(45.0f, width() / float(height()), 0.1f, 100.0f);shaderProgram.setUniformValue("model", model);shaderProgram.setUniformValue("view", view);shaderProgram.setUniformValue("projection", projection);glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);texture->release();vao.release();shaderProgram.release();zRot += 0.5f;if (zRot > 360.0f) zRot -= 360.0f;//update();
}void OpenGLWidget::mousePressEvent(QMouseEvent *event)
{lastMousePos = event->pos();
}void OpenGLWidget::mouseMoveEvent(QMouseEvent *event)
{if (event->buttons() & Qt::LeftButton) {float dx = event->pos().x() - lastMousePos.x();float dy = event->pos().y() - lastMousePos.y();xRot += dy;yRot += dx;lastMousePos = event->pos();update();}
}void OpenGLWidget::wheelEvent(QWheelEvent *event)
{float delta = event->angleDelta().y() / 120.0f;zoom += delta * 0.5f;zoom = qBound(-10.0f, zoom, -1.0f);update();
}
3. 渲染 3D 立方体
准备顶点数据
// 立方体顶点数据 (位置 + 颜色 + 纹理坐标)float scale = 2.0f;float vertices[] = {// 前面-0.5f*scale, -0.5f*scale, 0.5f*scale, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,0.5f*scale, -0.5f*scale, 0.5f*scale, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f,0.5f*scale, 0.5f*scale, 0.5f*scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f,-0.5f*scale, 0.5f*scale, 0.5f*scale, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f,// 后面-0.5f*scale, -0.5f*scale, -0.5f*scale, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f,0.5f*scale, -0.5f*scale, -0.5f*scale, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,0.5f*scale, 0.5f*scale, -0.5f*scale, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,-0.5f*scale, 0.5f*scale, -0.5f*scale, 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f,// 左面-0.5f*scale, -0.5f*scale, -0.5f*scale, 0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,-0.5f*scale, -0.5f*scale, 0.5f*scale, 0.6f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,-0.5f*scale, 0.5f*scale, 0.5f*scale, 0.6f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,-0.5f*scale, 0.5f*scale, -0.5f*scale, 0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,// 右面0.5f*scale, -0.5f*scale, -0.5f*scale, 1.0f, 0.2f, 0.2f, 1.0f, 1.0f, 0.0f,0.5f*scale, -0.5f*scale, 0.5f*scale, 1.0f, 0.2f, 0.2f, 1.0f, 0.0f, 0.0f,0.5f*scale, 0.5f*scale, 0.5f*scale, 1.0f, 0.2f, 0.2f, 1.0f, 0.0f, 1.0f,0.5f*scale, 0.5f*scale, -0.5f*scale, 1.0f, 0.2f, 0.2f, 1.0f, 1.0f, 1.0f,// 顶面-0.5f*scale, 0.5f*scale, 0.5f*scale, 1.0f, 0.1f, 0.1f, 1.0f, 0.0f, 0.0f,0.5f*scale, 0.5f*scale, 0.5f*scale, 1.0f, 0.1f, 0.1f, 1.0f, 1.0f, 0.0f,0.5f*scale, 0.5f*scale, -0.5f*scale, 1.0f, 0.1f, 0.1f, 1.0f, 1.0f, 1.0f,-0.5f*scale, 0.5f*scale, -0.5f*scale, 1.0f, 0.1f, 0.1f, 1.0f, 0.0f, 1.0f,// 底面-0.5f*scale, -0.5f*scale, 0.5f*scale, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,0.5f*scale, -0.5f*scale, 0.5f*scale, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,0.5f*scale, -0.5f*scale, -0.5f*scale, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,-0.5f*scale, -0.5f*scale, -0.5f*scale, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f};// 索引数据保持不变unsigned int indices[] = {0, 1, 2, 2, 3, 0,4, 5, 6, 6, 7, 4,8, 9, 10, 10, 11, 8,12, 13, 14, 14, 15, 12,16, 17, 18, 18, 19, 16,20, 21, 22, 22, 23, 20};
初始化 VAO, VBO 和 EBO
// 初始化 VAO, VBO 和 EBOvao.create();vbo.create();ebo.create();vao.bind();vbo.bind();vbo.allocate(vertices, sizeof(vertices));ebo.bind();ebo.allocate(indices, sizeof(indices));
创建着色器程序
// 顶点着色器const char *vertexShaderSource = R"(#version 330 corelayout(location = 0) in vec3 aPos;layout(location = 1) in vec4 aColor;layout(location = 2) in vec2 aTexCoord;out vec4 ourColor;out vec2 TexCoord;uniform mat4 model;uniform mat4 view;uniform mat4 projection;void main(){gl_Position = projection * view * model * vec4(aPos, 1.0);ourColor = aColor;TexCoord = aTexCoord;})";// 编译着色器shaderProgram.addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
// 片段着色器const char *fragmentShaderSource = R"(#version 330 corein vec4 ourColor;in vec2 TexCoord;out vec4 FragColor;uniform sampler2D texture1;void main(){vec4 texColor = texture(texture1, TexCoord);FragColor = texColor * ourColor;})";shaderProgram.addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
4. 实现 3D 渲染
void OpenGLWidget::paintGL()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);shaderProgram.bind();vao.bind();texture->bind(0);QMatrix4x4 model;QMatrix4x4 view;QMatrix4x4 projection;model.rotate(xRot, 1.0f, 0.0f, 0.0f);model.rotate(yRot, 0.0f, 1.0f, 0.0f);model.rotate(zRot, 0.0f, 0.0f, 1.0f);view.translate(0.0f, 0.0f, zoom);projection.perspective(45.0f, width() / float(height()), 0.1f, 100.0f);shaderProgram.setUniformValue("model", model);shaderProgram.setUniformValue("view", view);shaderProgram.setUniformValue("projection", projection);glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);texture->release();vao.release();shaderProgram.release();zRot += 0.5f;if (zRot > 360.0f) zRot -= 360.0f;
}
5. 添加纹理
加载纹理
// 加载纹理QImage img(":/textures/test.jpeg");if (img.isNull()) {qDebug() << "Failed to load texture image!";img = QImage(2, 2, QImage::Format_RGB32);img.fill(Qt::red);}texture = new QOpenGLTexture(img.mirrored());texture->setMinificationFilter(QOpenGLTexture::Linear);texture->setMagnificationFilter(QOpenGLTexture::Linear);texture->setWrapMode(QOpenGLTexture::Repeat);shaderProgram.setUniformValue("texture1", 0);
更新顶点属性指针
// 设置顶点属性指针shaderProgram.setAttributeBuffer(0, GL_FLOAT, 0, 3, 9 * sizeof(float));shaderProgram.enableAttributeArray(0);shaderProgram.setAttributeBuffer(1, GL_FLOAT, 3 * sizeof(float), 4, 9 * sizeof(float));shaderProgram.enableAttributeArray(1);shaderProgram.setAttributeBuffer(2, GL_FLOAT, 7 * sizeof(float), 2, 9 * sizeof(float));shaderProgram.enableAttributeArray(2);
完整工程代码:
https://gitee.com/byxdaz/opengl3d-instance
运行效果图:
相关文章:

Qt OpenGL 3D 编程入门
Qt 提供了强大的 OpenGL 集成功能,使得在 Qt 应用中实现 3D 图形变得更加简单。以下是使用 Qt 进行 OpenGL 3D 编程的基础知识。 1. 环境配置 创建 Qt 项目 新建 Qt Widgets Application 项目 在 .pro 文件中添加 OpenGL 模块: qmake QT co…...

性能优化 - 工具篇:基准测试 JMH
文章目录 Pre引言1. JMH 简介2. JMH 执行流程详解3. 关键注解详解3.1 Warmup3.2 Measurement3.3 BenchmarkMode3.4 OutputTimeUnit3.5 Fork3.6 Threads3.7 Group 与 GroupThreads3.8 State3.9 Setup 与 TearDown3.10 Param3.11 CompilerControl 4. 示例代码与分析4.1 关键点解读…...
Ubuntu 中安装 PostgreSQL 及常规操作指南
目录 一、安装 PostgreSQL 最新版本安装(推荐) 安装特定版本(如 14) 二、基本服务管理 三、连接数据库 四、常规数据库操作 1. 用户与权限管理 2. 数据库管理 3. 表操作 4. 数据操作 五、常用 psql 元命令 六、备份与恢…...

Nginx网站服务:从入门到LNMP架构实战
🏡作者主页:点击! Nginx-从零开始的服务器之旅专栏:点击! 🐧Linux高级管理防护和群集专栏:点击! ⏰️创作时间:2025年5月30日14点22分 前言 说起Web服务器,…...

Java面试八股--08-数据结构和算法篇
1、怎么理解时间复杂度和空间复杂度 时间复杂度和空间复杂度一般是针对算法而言,是衡量一个算法是否高效的重要标准。先纠正一个误区,时间复杂度并不是算法执行的时间,在纠正一个误区,算法不单单指冒泡排序之类的,一个…...

Java面试八股--06-Linux篇
目录 一、Git 1、工作中git开发使用流程(命令版本描述) 2.Reset与Rebase,Pull与Fetch的区别 3、git merge和git rebase的区别 4、git如何解决代码冲突 5、项目开发时git分支情况 二、Linux 1、Linux常用的命令 2、如何查看测试项目的…...
Ajax技术分析方法全解:从基础到企业级实践(2025最新版)
引言 Ajax技术自2005年正式命名以来,已支撑全球83%的Web应用实现异步交互。2025年最新数据显示,单页面应用(SPA)的Ajax请求密度已达日均120亿次/应用。本文将系统化解析Ajax分析方法论,涵盖从基础原理到企业级工程实践的完整技术栈。 一、Ajax技术架构解构 1.1 核心组件…...
Unity 性能优化终极指南 — GameObject 篇
🎯 Unity 性能优化终极指南 — GameObject 方法篇 🧩 GameObject 是什么?—— Unity世界的核心实体 GameObject 是 Unity 引擎中最核心、最基础的构建单元。它代表了场景中的一个实体对象,可以是一个角色、一个UI元素、一盏灯光、…...

dvwa7——SQL Injection
LOW: f12打开hackbar 一:判断注入类型 输入id1报错 闭合单引号 ,页面恢复正常 所以为单引号字符型 二:开始攻击 1.判断列数 ?id1 order by 2-- 到3的时候开始报错,所以一共两列 2.爆回显位置 ?id-1 union s…...
Spring AI 项目实战(四):Spring AI + DeepSeek 超参数优化——智能化机器学习平台(附完整源码)
系列文章 序号文章名称1Spring AI 项目实战(一):Spring AI 核心模块入门2Spring AI 项目实战(二):Spring AI + DeepSeek 深度实战(附完整源码)3Spring AI 项目实战(三):Spring AI + DeepSeek 打造智能客服系统(附完整源码)4Spring AI 项目实战(四):Spring AI +…...
Axure疑难杂症:中继器图片替换功能优化(支持修改已有记录-玩转中继器)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 案例视频: 中继器图片替换功能优化 课程主题:中继器图片替换功能优化(支持修改已有记录) 主要内…...

sqlite3 命令行工具详细介绍
一、启动与退出 启动数据库连接 sqlite3 [database_file] # 打开/创建数据库文件(如 test.db) sqlite3 # 启动临时内存数据库 (:memory:) sqlite3 :memory: # 显式启动内存数据库文件不存在时自动创建不指定文件名则使用临时内…...

ubuntu 22.04 编译安装nignx 报错 openssl 问题
前言 Ubuntu 20.04 中安装 Nginx (通过传包编译的方式)、开启关闭防火墙、开放端口号 在ubuntu 22.04.3 服务器上照着上面的文章 通过传包编译的方式安装nginx-1.18.0 的时候报错,报错内容如下: src/event/ngx_event_openssl.c: In function ‘ngx_ssl…...

线程相关面试题
提示:线程相关面试题,持续更新中 文章目录 一、Java线程池1、Java线程池有哪些核心参数,分别有什么的作用?2、线程池有哪些拒绝策略?3、说一说线程池的执行流程?4、线程池核心线程数怎么设置呢?4、Java线程…...

pikachu通关教程-目录遍历漏洞(../../)
目录遍历漏洞也可以叫做信息泄露漏洞、非授权文件包含漏洞等. 原理:目录遍历漏洞的原理比较简单,就是程序在实现上没有充分过滤用户输入的../之类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。 这里的目录跳转符可以是../…...

Maven-生命周期
目录 1.项目对象模型 2.依赖管理模型 3.仓库:用于存储资源,管理各种jar包 4.本地仓库路径 1.项目对象模型 2.依赖管理模型 3.仓库:用于存储资源,管理各种jar包 4.本地仓库路径...
Hadoop复习(九)
Azkaban工作流管理器 选择 问题 1 判断题 2 / 2 分 工作流是指具有依赖的一组job任务,被依赖的job任务最后执行 正确 错误 问题 2 判断题 2 / 2 分 Azkaban兼容任何版本的Hadoop 正确 错误 问题 3 判断题 2 / 2 分 独立服务器模式下,Azkab…...

Matlab实现LSTM-SVM回归预测,作者:机器学习之心
Matlab实现LSTM-SVM回归预测,作者:机器学习之心 目录 Matlab实现LSTM-SVM回归预测,作者:机器学习之心效果一览基本介绍程序设计参考资料 效果一览 基本介绍 代码主要功能 该代码实现了一个LSTM-SVM回归预测模型,核心流…...

Spring Boot 自动配置原理:从入门到精通
Spring Boot 的自动配置是其核心特性之一,它极大地简化了 Spring 应用的开发,让开发者可以专注于业务逻辑,而无需编写大量的配置代码。 本文将深入探讨 Spring Boot 自动配置的原理,帮助你理解其工作机制,并能灵活运用…...
实践深度学习:构建一个简单的图像分类器
引言 深度学习在图像识别领域取得了巨大的成功。本文将指导你如何使用深度学习框架来构建一个简单的图像分类器,我们将以Python和TensorFlow为例,展示从数据准备到模型训练的完整流程。 环境准备 在开始之前,请确保你的环境中安装了以下工…...

腾讯 ovCompose 开源,Kuikly 鸿蒙和 Compose DSL 开源,腾讯的“双”鸿蒙方案发布
近日,腾讯的 ovCompose 和 Kuikly 都发布了全新开源更新,其中 Kuikly 在之前我们聊过,本次 Kuikly 主要是正式开源鸿蒙支持部分和 Compose DSL 的相关支持,而 ovCompose 是腾讯视频团队基于 Compose Multiplatform 生态推出的跨平…...

PYTHON调用讯飞C/C++动态库实现离线语音合成并且实时播放
语音合成(Text-to-Speech, TTS)技术在现代应用中扮演着越来越重要的角色,从智能客服到有声读物,从导航系统到辅助工具,TTS技术无处不在。本文将详细介绍如何使用Python结合科大讯飞的离线SDK实现一个本地化的语音合成系统。 技术背景 离线语…...

黑马Java面试笔记之 消息中间件篇(RabbitMQ)
一. 消息丢失问题 RabbitMQ如何保证消息不丢失? 使用场景有: 异步发送(验证码、短信、邮件... )MYSQL和Redis,ES之间的数据同步分布式事务削峰填谷...... 消息丢失原因会有三种情况,分别分析一下 1.1 生…...
Vue中安装插件的方式
一. 认识Vue插件 1.1. 通常向Vue全局添加一些功能时,会采用插件的模式,它有两种编写方式: 1.1.1. 对象类型:一个对象,但是必须包含一个install的函数,该函数会在安装插件时执行 // 方式一:传入…...
如何提高工作效率
最近,跟一个同事同时测同一业务,在对比自己与同事的产出过程中,发现,别人工作效率极高,产出也比较大。最重要的是,别人每天晚上走得早,自己就算加班到九点十点,似乎产出都没别人高。…...

Redisson学习专栏(五):源码阅读及Redisson的Netty通信层设计
文章目录 前言一、分布式锁核心实现:RedissonLock源码深度解析1.1 加锁机制:原子性与重入性实现1.2 看门狗机制:锁自动续期设计1.3 解锁机制:安全释放与通知1.4 锁竞争处理:等待队列与公平性1.5 容错机制:异…...
Spring AI 项目实战(一):Spring AI 核心模块入门
系列文章 序号文章名称1Spring AI 项目实战(一):Spring AI 核心模块入门一、引言:Java 生态下 AI 应用开发的新机遇 在数字化转型浪潮席卷全球的当下,人工智能(AI)技术早已突破实验室的边界,深度融入企业级应用开发核心领域。对于Java开发者而言,如何将成熟稳定的Spr…...
字节跳动开源图标库:2000+图标一键换肤的魔法
一个SVG文件生成四种主题的神奇技术,正在颠覆前端开发者的图标工作流。 深夜两点,设计师小王对着屏幕抓狂——产品经理临时要求将整套线性图标改为双色风格,这意味着他需要重新导出上百个SVG文件。 而隔壁工位的前端小张同样崩溃:…...

结合 AI 生成 mermaid、plantuml 等图表
AI 画图 AI 画图并不是真的让 AI 画一个图片,而是让 AI 根据你的需求,生成对应的需求文本,再根据 “文本画图” 来生成图片。 Mermaid mermaid 支持流程图、时序图、架构图等等多种图片绘制。当然最终生成的效果和样式会根据不同的“文本代…...
行列式详解:从定义到应用
行列式详解:从定义到应用 引言 行列式是线性代数中的核心概念之一,它不仅是矩阵理论的重要组成部分,更是解决线性方程组、计算向量空间体积、判断矩阵可逆性等问题的关键工具。本文将从行列式的基本定义出发,系统地介绍其性质、…...