自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不会飞的纸飞机的博客

一个编程小白的编程学习总结

  • 博客(127)
  • 资源 (7)
  • 收藏
  • 关注

原创 个人技术文章汇总

QGraphicsView框架。Windows程序设计。

2020-02-09 18:40:17 4911

原创 Qt Windows和Android使用MuPDF预览PDF文件

Windows和Android下,使用Qt和MuPDF库预览PDF文件

2024-02-07 18:31:07 1466

翻译 蒙皮骨骼动画

本篇文章为翻译文章,由于此文章 LearnOpenGLCN 没有进行翻译,我这里翻译一下。原文链接: https://learnopengl.com/Guest-Articles/2020/Skeletal-Animation3D动画可以给我们的游戏带来生命。3D世界中的物体,如人类和动物,当他们移动他们的四肢做某些事情,如行走,奔跑和攻击时,感觉更有生机。本教程是关于你期待已久的骨骼动画。我们首先将彻底理解一些概念,然后我们通过使用Assimp库,了解需要使用3D模型动画的数据。我建议你完成这个sag

2021-05-19 17:57:05 2706

原创 异地过年,我要用它看春晚!- Qt趣味开发之基于QtAV的电视播放器

今年过年因为疫情的关系,在工作地点过年。家里穷的连个电视都没有,春晚都看不了,怎么办??!!QtAV是一个开源的音视频播放器,支持播放本地文件和网络流媒体。并集成了多种视频渲染方式,使用它的简单的API可以轻松的实现做一个网络电视播放器(我这里在网上找的RTMP的地址)。更多关于QtAV的介绍,可以参考QtAV的github主页:https://github.com/wang-bin/QtAV下面是我基于QtAV做的简易版本的电视播放器:QtAV播放RTMP的代码也很简单:using nam

2021-02-10 16:31:59 1738

原创 Qt与OpenGL趣味开发 - 绘制炫酷倒影

我们来用Qt和OpenGL绘制一个倒影,先看一下显示效果:绘制方法比较简单,步骤如下:绘制正常的两个箱子。绘制地板。绘制前,禁止 深度测试 写入;开启 蒙版测试 ,将蒙版测试函数设置为 GL_ALWAYS ,绘制时将蒙版缓冲区写入1。绘制后,开启深度测试写入。绘制倒影的箱子。绘制前,设置模板测试函数,参数为 GL_EQUAL ,表示蒙版缓冲区为1的时候才会通过蒙版测试。绘制时只要把箱子绘制的灰一点,就可以实现了倒影的效果。绘制部分的关键代码如下:// 开启深度测试glEnable(GL_

2021-02-08 16:37:00 1082

原创 圣诞节到了!!你的桌面下雪了吗?? - Qt趣味开发之让你的桌面下雪

圣诞节到了,写个桌面下雪的程序庆祝一下。过节也是要有仪式感的!!显示效果如下:具有如下功能:托盘菜单,可以配置、关于作者、退出。可以配置是否下雪、烟花效果,配置雪的浓度和下降的速度。完整代码和可执行程序下载:可执行程序:链接:https://pan.baidu.com/s/1NMod82jHwLsZE944Tl7KSg提取码:ne9u源码下载:链接:https://pan.baidu.com/s/1_Wq7zyG_R24HkJUX9uTXbw提取码:ragy1. 下雪的实现

2020-12-25 03:41:16 2552 4

翻译 COM编程入门Part Ⅱ - 深入理解COM服务器[译]

本篇文章为翻译文章,适合像我一样,之前从来没有接触过COM编程的人,如果翻译的有什么不足之处,希望大家多多指出。原文链接:https://www.codeproject.com/Articles/901/Introduction-to-COM-Part-II-Behind-the-Scenes-of-a本篇文章为译文的第二部分,第一部分链接:COM编程入门Part Ⅰ- 什么是COM和如何使用COM [译]下面为译文部分:这是一个面向COM新手程序员的教程,解释了COM服务器的内部原理,以及如

2020-12-10 19:53:59 661

原创 Qt趣味开发之打造一个3D名字渲染小工具

文章目录1. 名字数据生成工具2. OpenGL名字渲染工具3. CPU名字渲染工具(1)投影(2)面消隐算法本篇文章讲介绍三个软件:名字数据生成工具OpenGL名字渲染工具CPU名字渲染工具这三个小东西一共花了我三天时间,接下来分别看一下这是三个软件的显示效果:名字数据生成工具 ,点击Create可以生成名字数据(本人不姓李哈^v^)OpenGL名字渲染工具 , 使用Opengl渲染成3D图像,点击Load加载之前生成的数据CPU名字渲染工具 , 接下来是使用CPU实现的渲染同

2020-12-10 10:31:22 658

翻译 COM编程入门Part Ⅰ- 什么是COM和如何使用COM [译]

本篇文章为翻译文章,适合像我一样,之前从来没有接触过COM编程的人,如果翻译的有什么不足之处,希望大家多多指出。原文链接:https://www.codeproject.com/Articles/633/Introduction-to-COM-What-It-Is-and-How-to-Use-It以下为译文部分:文章目录本文的目的介绍COM到底是什么?基本元素的定义使用COM对象创建COM对象删除一个COM对象基本接口 - IUnknown密切关注 - 字符串处理WideCharToMultiBy

2020-11-30 17:23:19 1079

原创 基于QGraphicsView的简易画板EasyCanvas -- 第二版

EasyCanvas 第二版,第一版的功能可参见:基于QGraphicsView的简易画板EasyCanvas – 第一版第二版 在第一版的基础上增加如下功能:节点树撤销/重做Python脚本动态修改节点属性方案管理1. 节点树具有同步选择节点、删除节点、节点重命名和搜索的功能。节点树使用Qt的Model-View框架实现2. 撤销/重做(Redo/Undo)使用Qt的 QUndoCommand 和 QUndoStack 的实现。快捷键 Ctrl+Z 撤销,Ctrl+Y 重做

2020-09-05 18:30:14 3624 23

原创 Qt与OpenGL编程 - IBO与线框模式

文章目录1. 索引缓冲对象(IBO)(1) 创建IBO(2)设置IBO的数据(3)绘制2. 线框模式1. 索引缓冲对象(IBO)索引缓冲对象(Element Buffer Object, EBO,也叫Index Buffer Object, IBO)。假设我们要绘制得不是三角形,而是四边形,那么我们要写生成得节点组合可能是这样的:GLfloat vertices[] = { // 第一个三角形 0.5f, 0.5f, 0.0f, // 右上角 0.5f, -0.5f, 0

2020-08-08 20:48:28 1114

原创 Qt与OpenGL编程 - Hello三角形

OpenGL是一个跨平台的GPU渲染库,Qt对OpenGL做了一部分的封装,可以使我们更加方便的使用OpenGL。关于OpenGL更多的相关学习内容可以参考(比较全和详细的OpenGL教程):LearnOpenglcn文章目录1. 渲染管线2. 标准化设备坐标3. 关于QOpenGLWidget4. VBO(1)创建VBO。(2)为VBO设置顶点属性数据(3)链接顶点属性5. 编写着色器(Shader)(1) 顶点着色器(Vertex Shader)(2)片段着色器(Fragment Shader)(

2020-07-11 19:33:20 1345

原创 使用QGraphicsBlurEffect实现图片背景模糊效果

先看一下实现效果:类 QGraphicsBlurEffect 可以实现图像的模糊效果,它的相关接口主要有如下两个:void setBlurHints(QGraphicsBlurEffect::BlurHints hints)void setBlurRadius(qreal blurRadius)setBlurHints 是设置模糊质量的函数,它的参数有如下几种:PerformanceHint 表明渲染性能是最重要的因素,但可能会降低渲染质量。(默认参数)QualityHint 表明渲染

2020-06-25 14:37:50 2916 8

原创 MySQL数据库学习笔记(10)- distinct与in和exists子查询

1. distinct的使用distinct 用于在查询中返回列的唯一不同值(去重复),支持单列或多列。(只能写在SELECT的后面)比如,我们想获取员工表中所有的部门,可以将SQL语句写成如下:SELECT DISTINCT department FROM employee;2. 子查询in如果运算符 in 后面的值是来源于某个查询结果,并非是指定的几个值,这是就需要用到子查询。子查询又称为内部查询或嵌套查询,即在SQL查询的WHERE子句中嵌入查询语句。它的基本形式如下:SELECT c

2020-06-23 06:34:19 872

原创 MySQL数据库学习笔记(9)- DQL之表连接(内连接、外连接、自连接)

表连接(JOIN)是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表直接获取数据。在介绍表连接之前,首先介绍一下外键1. 外键(foreign key)外键(foreign key) 为某个表中的一列,它包含另一个表的主键。...

2020-06-21 22:55:22 285

原创 MySQL数据库学习笔记(8)- DQL之分组数据

文章目录1. 分组的基本使用2. 分组过滤3. group_concat的使用MySQL中使用 group by 对数据进行分组。它必须配合聚合函数进行使用,对数据进行分组后可以执行 count 、 sum 、 avg 、 max 和 min 等操作。1. 分组的基本使用下面是一个简单的示例,将员工表 employee 按照部门 department 进行分组,统计各个部门的人数。完整的表中数据如下:使用如下语句对数据进行分组:SELECT department, Count(*) FRO

2020-06-13 17:43:52 240

原创 使用FFMpeg API 获取摄像头的图像数据

文章目录1. 获取摄像头的信息2. 打开并初始化摄像头3. 获取摄像头数据及渲染摄像头是我们比较常用的外设,很多场景我们都会用到摄像头。比如视频直播、视频监控等各个领域都会用到摄像头。摄像头图像数据的获取,方法有很多,比如可以使用Qt自带的API获取,也可以使用DirectShow、OpenCV、FFMpeg提供的API方式获取(本质上是通过DirectShow)。本篇文章主要讲述使用FFMpeg API获取摄像头的数据信息。下面是一个简单的摄像头显示的例子的实现效果:使用FFMpeg获取摄像头的

2020-05-25 01:00:26 4553

原创 MySQL数据库学习笔记(7)- DQL之内置函数

MySQL中的内置函数通常包括下面几种, 文本处理函数 、 日期与时间处理函数 、 数值处理函数 、 聚合函数 、条件判断函数 等。这些函数可以帮助用户方便的处理表中的数据,简化用户操作。1. 文本处理函数函数说明Left()返回字符串左边的字符Length()返回字符串的长度Locate()找出字符串的一个子串Lower()将字符串转换为小写LTrim()去掉字符串左边的空格Right()返回字符串右边的字符RTrim()去掉字符串

2020-05-23 21:54:25 196

原创 MySQL数据库学习笔记(6)- DQL之IN、LIKE、查询结果排序与分页

文章目录1. IN2. LIKE3. 排序4. 分页1. IN运算符 IN 允许我们在 WHERE 子句中过滤某个字段的多个值。它的基本形式如下:SELECT [列名1, 列名2, ...] FROM 表名 WHERE 字段名 IN(值1, 值2, ...)下面是一个简单的示例,找到ID为2,3,4,9的记录SELECT * FROM employee WHERE id IN (2, 3, 4, 9);结果如下:2. LIKE当我们需要查询 包含 xxxx 的所有记录时,就需要使用

2020-05-20 00:16:24 414

原创 MySQL数据库学习笔记(5)- DQL之简单查询与条件查询

文章目录1. 简单查询语句2. 条件查询语句1. 简单查询语句MySQL中使用 select 语句进行数据的查询,它的一般形式如下:SELECT column_name1, column_name2 FROM table_name [WHERE where_condition][GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]] [HAVING where_condition][ORDER BY {col_name | exp

2020-05-19 23:30:49 351

原创 MySQL数据库学习笔记(4)- DML之数据的插入、修改和删除

1. 数据的插入MySQL中向数据库中插入数据,使用 INSERT INTO 语句插入单条语句INSERT INTO 表名 (field1, field2, ..., fieldN) VALUES (value1, value2, ..., valueN);下面是向一个数据表中插入数据的简单例子这里有一张person表,里面有三列,具体形式如下:INSERT INTO person (name, id_number) VALUES('不会飞的纸飞机', '2222111144445555

2020-05-18 06:25:24 238

原创 MySQL数据库学习笔记(3)- DDL之数据表的创建、删除及修改

文章目录1. MySQL的存储引擎2. MySQL的数据类型3. MySQL数据表的创建、删除和修改1. MySQL的存储引擎存储引擎 就是如何存储数据、如何更新数据、如何查询数据、如何为存储的数据建立索引等一系列技术的实现方法。使用如下语句查询MySQL的存储引擎SHOW ENGINES;下面是关于MySQL存储引擎的简单介绍:存储引擎描述MyISAM拥有较快的插入、查询速度,但不持支事务InnoDB支持ACID事务,支持行级锁,支持外键;MySQL5.5版本

2020-05-14 00:57:27 417

原创 MySQL数据库学习笔记(2)- DDL之数据库的创建和删除

1. 查看所有的数据库SHOW DATABASES;结果如下:其中数据库 information_schema 、 mysql 、 performance_schema 、 sys 为MySQL的系统自带数据库。他们的主要作用如下:information_schema : 提供访问数据库元数据的方式。( 元数据 是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有时用于表述该信息的其他术语包括“数据词典”和“系统目录”。)mysql : mysql的核心数据库,类似于sql

2020-05-11 23:41:55 226

原创 MySQL数据库学习笔记(1)- 数据库基本概念

文章目录1. 数据库的基本概念和分类(1) 什么是数据库(2) 数据库的分类(3) 数据库管理系统(4) RDBMS介绍(5) 主流的RDBMS2. SQL简介及分类(1) SQL简介(2) SQL语言的分类3. 数据库的连接(1) 服务的启停(2) 连接MySQL服务1. 数据库的基本概念和分类(1) 什么是数据库数据库 是按照数据结构来组织、存储和管理数据的仓库。数据库是长期存储在计算机内、有组织、可共享的、统一管理的大量数据的集合。数据库中数据按一定的数据模型组织、描述和存储,具有较小的冗余

2020-05-10 23:05:47 388

原创 使用PythonQt实现C++与Python混合编程

PythonQt提供了一种将python脚本语言嵌入到Qt C++程序中的简单方法。我们可以使用一种脚本语言,扩展我们的应用,Qt中对于脚本化扩展应用程序有两种方法使用JavaScript扩展。可以参考我的上一篇文章,使用Qt QJSEngine实现JavaScript与C++混合编程使用Python扩展。很多知名的软件都是用python脚本的方式,扩展自己的应用程序:Blende...

2020-04-19 00:12:51 7130 8

原创 使用Qt QJSEngine实现JavaScript与C++混合编程

QJSEngine实现了一个Qt中JavaScript的运行环境,使用的是Chrome的V8引擎。下面介绍一下QJSEngine的简单使用。文章目录1. 执行JavaScript的代码2. 脚本异常3. JavaScript中调用C++(1)添加全局对象属性(2)添加类对象属性(3)添加类属性1. 执行JavaScript的代码使用函数 evaluate 实现执行一个JavaScript...

2020-04-07 22:32:13 5290 1

原创 基于QGraphicsView的简易画板EasyCanvas -- 第一版

最近使用 QGraphicsView 做了个简易的画板 EasyCanvas ,界面效果如下:具有如下功能:画布设置图元添加和修改保存为图片1. 画布设置可以通过右侧画布属性,设置画布的尺寸和背景颜色2. 图元设置可以添加、修改、删除图元,通过鼠标拖拽的,选择、平移和旋转关于平移、改变尺寸和旋转可以参照这上一篇文章:自定义QGraphicsItem实现平移、改变尺寸和...

2020-03-30 22:52:58 4935 6

原创 自定义QGraphicsItem实现平移、改变尺寸和旋转

文章目录1. 平移2. 改变尺寸3. 旋转我们在使用QGraphicsView框架的时候,经常需要自定义QGraphicsItem,并且需要实现Item的平移、改变大小和旋转的效果。接下来介绍他们的一种实现方式1. 平移平移效果如下图所示:实现方式有两种方法:使用QGraphicsItem本身的移动标志实现。this->setFlag(QGraphicsItem::Ite...

2020-03-21 22:34:02 16985 25

原创 QtConcurrent多线程 - map、mapped和mappedReduced

文章目录1. map 和 mapped2. mappedReduced3. 其他扩展Qt中的 Concurrent 模块为我们提供了在一个序列容器类型针对每一个元素的多线程并行运算,比如 QList 、 QVector 。QtConcurrent::map() :对序列的每一项元素都应用一个函数,并将运算结果替换原来的元素。QtConcurrent::mapped() :功能类似 ma...

2020-03-09 22:32:10 4372 1

原创 使用QWaitCondition实现一个简单的线程池

上篇文章主要讲了线程池的使用Qt中的线程池QThreadPool本篇文章使用Qt的条件变量 QWaitCondition ,实现一个简单的线程池关于 QWaitCondition 的使用,可以参照 线程的互斥和同步(7)- Qt的条件变量QWaitCondition先来说一下简单的思路,线程池初始化时创建一定数量的线程(8个) ,所有的线程处于挂起状态。当任务添加到列表时,唤醒一个线程执...

2020-03-06 22:21:45 581 1

原创 QtConcurrent多线程 - run()与QFuture

文章目录1. run()函数2. QFuture3. QFutureWatcherQt中的 Concurrent 模块,为我们提供高级的(high-level)API 编写多线程程序,而不用使用低级的(low-level)线程元语(如互斥锁、读写锁、信号量、条件变量等)。使用的时候需要在.pro文件中添加 concurrent 模块QT += concurrent我们首先来介绍一下 Q...

2020-03-06 00:10:25 8567 1

原创 线程的互斥和同步(9)- Qt中的读写锁QReadWriteLock

Qt中提供了 QReadWriteLock 类,我们可以方便的使用读写锁。读写锁 是指 读锁 和 写锁 。适用于多个线程读操作比较频繁,而写操作不频繁的场景中。它能够保证多个线程读操作访问资源时同时进行,而写入操作时阻塞读操作。也就是我们常说的,读共享 和 写独占 。1. 读共享和写独占读共享 :当其他线程占用读锁的时候,如果其他线程请求读锁,会立即获得。当其他线程占用读锁的时候,...

2020-02-27 21:27:09 2504 1

原创 Qt中的线程池QThreadPool

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永...

2020-02-26 22:50:41 13144 2

原创 线程的互斥和同步(8)- C++11中的互斥锁和条件变量

文章目录1. 互斥锁(1) 递归锁和非递归锁(2) 互斥锁管理类2. std::condition_variable1. 互斥锁之前讲过使用Windows的API和Qt中如何创建和使用互斥锁。接下来,主要说明一下C++11中的互斥锁。c++11中的互斥锁主要有如下几种:互斥锁说明mutex最基本的互斥锁,不可重入timed_mutex具有超时机制的互斥锁...

2020-02-23 20:34:46 766

原创 线程的互斥和同步(7)- Qt的条件变量QWaitCondition

QWaitCondition 提供了一个用于同步线程的条件变量。它允许一个线程后告诉其他的线程已经满足了某种条件;一个或多个线程可以阻塞等待 QWaitCondition 来使用 wakeOne() 或 wakeAll() 设置条件。使用 wakeOne() 唤醒一个随机选择的线程或者 wakeAll() 唤醒全部等待的线程。下面是 QWaitCondition 类中,常用的函数介绍:bo...

2020-02-23 13:09:54 1836 1

原创 线程的互斥和同步(6)- Qt的信号量QSemaphore

上一篇文章主要介绍了使用Windows API创建和使用信号量Semaphore线程的互斥和同步(5)- Windows的信号量Semaphore本篇文章只要介绍Qt的信号量 QSemaphore 类的使用,并用一个 生产者-消费者 实例来说明信号量是如何提高多线程的效率的。下面是使用类 QSemaphore 常用的函数:void acquire (int n = 1); 表示请求n...

2020-02-20 20:59:10 1591 1

原创 线程的互斥和同步(5)- Windows的信号量Semaphore

信号量也是进程间同步常用的手段之一。举个例子,比如我们要去餐馆吃饭,这家餐馆一共有4个位置,我们一共是6个人。那么就会4个人先去吃饭,等他们吃完了,剩下的2个人再去吃饭,如果再来人则需要判断是否有空位置,如果有直接坐下吃饭,如果没有则需要等待。这里的每一个顾客就相当于一个线程,而通知你排队叫号进餐的那个服务员就是我们的信号量。信号量可以有效的保证我们多个线程并发执行。对于信号量,我们经常使用的...

2020-02-19 21:31:38 1042

原创 线程的互斥和同步(4)- Qt中的互斥锁(QMutex和QMutexLocker)

上一篇文章主要介绍了Windows的互斥锁线程的互斥和同步(3)- Windows的互斥锁Linux也有自己API来操作互斥锁,对于跨平台的操作,Qt帮助我们使用一套代码实现相同的效果。Qt中使用类 QMutex 和 QMutexLocker 来实现和管理互斥锁。类 QMutex 的主要函数有:lock (); 加锁,如果该互斥锁被占用,该函数阻塞,直到互斥锁被释放。u...

2020-02-17 21:30:35 1756 1

原创 线程的互斥和同步(3)- Windows的互斥锁

什么是互斥锁/互斥量?在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象;选自百度百科-互斥锁。同一时刻只有一个线程访问互斥锁,如果其他线程请求占用该互斥锁时,该请求锁的线程会被挂起。直到锁的拥有者释放该互斥锁,CPU调度到请求锁的线程占有该互斥锁,该线程被唤醒。Windows中...

2020-02-17 00:06:09 1153 1

原创 Qt绘制文字轮廓

首先看一下使用Qt绘制文字轮廓效果:这里使用 QPainter 中的 strokePath 函数实现文字轮廓的绘制。void QPainter::strokePath(const QPainterPath &path, const QPen &pen)函数 strokePath 表示使用pen绘制一个路径的轮廓。Draws the outline (strokes) t...

2020-02-15 22:07:32 2980 2

EasyQtAVTV_Code.zip

基于QTAV的电视播放器,EasyQtAVTV源代码

2021-02-10

EasyQtAVTV.zip

基于QtAV的简易电视播放器

2021-02-10

assimp.zip

VS2019编译-x64 编译好的Assimp库

2021-02-08

ScreenSnow_src.zip

桌面下雪软件源代码

2020-12-25

ScreenSnow.zip

桌面下雪软件可执行程序

2020-12-25

COMIntro2.zip

文章《COM编程入门Part Ⅱ - 深入理解COM服务器[译]》 源码和可执行文件,方便大家下载。

2020-12-10

COM编程入门Part Ⅱ - 深入理解COM服务器[译] (代码)

文章《COM编程入门Part Ⅱ - 深入理解COM服务器[译]》的代码。为了方便大家,下载源码,我上传到了这里。

2020-12-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除