自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 收藏
  • 关注

原创 Qt:Qt界面优化

在网页前端开发领域中,CSS是⼀个至关重要的部分,描述了⼀个网页的"样式",从起到对网页美化的作用。所谓样式,包括不限于大小,位置,颜色,背景,间距,字体等等。现在的网页很难找到没有CSS的,可以说让"界面好看"是⼀个刚需。网页开发作为GUI的典型代表,也对于其他客户端GUI开发产⽣了影响.Qt也是其中之⼀.Qt 仿照CSS的模式,引入了QSS,来对Qt中的控件做出样式上的设定,从而允许程序员写出界面更好看的代码。

2025-02-12 15:30:58 755

原创 Qt:Qt网络

和多线程类似,Qt为了支持跨平台,对网络编程的API也进行了重新封装。咱们接下来的重点介绍Qt的网络相关的API的使用。实际Qt开发中进行网络编程,也不⼀定使用Qt封装的网络API,也有⼀定可能使用的是系统原生API或者其他第三方框架的API。在进行网络编程之前,需要在项目中的 .pro 文件中添加 network 模块有时添加之后要手动编译一下项目,使 Qt Creator 能够加载对应模块的头文件。

2025-02-12 10:51:38 679

原创 Qt:Qt多线程

在Qt中,多线程的处理一般是通过QThread类来实现。QThread代表一个在应用程序中可以独立控制的线程,也可以和进程中的其他线程共享数据。QThread对象管理程序中的一个控制线程。多线程的概述多线程是现代操作系统和编程语言提供的一个核心特性,它允许程序同时执行多个任务,从而提高应用程序的效率和响应性。在多线程环境中,每个线程可以看作是程序中的一个独立执行路径,它们可以并发执行,共享进程资源,但同时拥有自己的调用栈和程序计数器。多线程编程的挑战在于确保线程安全,避免竞态条件、死锁和资源冲突等问题。

2025-02-10 19:37:11 1012

原创 Qt:Qt文件与音视频

是应用程序必不可少的部分。Qt作为一个通用开发库,提供了跨平台的文件操作能力。Qt提供了很多关于文件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件复制或重命名等。

2025-02-10 17:25:10 839

原创 Qt:Qt事件

事件是应用程序内部或者外部产生的事情或者动作的统称。在Qt中使用一个对象来表示一个事件。所有的Qt事件均继承于抽象类QEvent。事件是由系统或者Qt平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制时,都会发出一个相应的事件。一些事件是在用户操作时发出,如键盘事件、鼠标事件等,另一些事件则是由系统本身自动发出,如定时器事件事件名称描述鼠标事件鼠标左键、鼠标右键、鼠标滚轮,鼠标的移动,鼠标按键的按下和松开键盘事件按键类型、按键按下、按键松开定时器事件定时时间到达。

2025-02-10 16:25:47 1045

原创 Qt:Qt窗口

对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。QFiledialog(文件对话框)、QColorDialog(颜色对话框)、QFontDialog(字体对话框)、QInputDialog(输入对话框)和QMessageBox(消息框)在Qt中,对话框是用于与用户进行交互的特殊窗口,通常用于输入数据、显示信息或进行设置。对话框可以是模态的也可以是非模态的。

2025-02-10 15:39:45 1068

原创 Qt:常用控件

Widget是Qt中的核心概念,英文原义是"小部件",此处将其翻译为"控件"。控件是构成一个图形化界面的基本要素,如按钮、列表视图、树形视图、单行输入框、多行输入框、滚动条、下拉框等都可以称为"控件"。Qt作为一个成熟的GUI开发框架,内置了大量的常用控件。Qt也提供了"自定义控件"的能力,可以在现有控件不能满足需求时,对现有控件做出扩展,或者自定义出新的控件。

2025-02-09 19:07:37 1084

原创 Qt:QWidget核心属性

若使用相对路径,则需要确保代码中的相对路径写法和图片实际所在的路径匹配(如代码中写作"./image/rose.png",就需在当前工作目录中创建image目录,并将rose.png放入)上述代码中是直接设置的QRect中的x、y,实际上QRect内部存储了左上和右下两个点的坐标,再通过两个点的坐标差值计算长宽,单纯修改左上坐标就会引起整个矩形的长宽发生改变。添加的文件必须是在qrc文件的同级目录,或者同级目录的子目录中,因此需要把之前D盘中的rose.png复制到上述目录中。

2025-02-08 19:54:07 677

原创 Qt:信号和槽机制

在Qt中,允许自定义信号的发送方以及接收方,即可以自定义信号函数和槽函数。但是对于自定义的信号函数和槽函数有⼀定的书写规范。自定义信号函数书写规范⾃定义信号函数必须写到 "signals" 下返回值为 void,只需要声明,不需要实现可以有参数,也可以发生重载自定义槽函数书写规范早期的Qt版本要求槽函数必须写到"public slots"下,但是现在高级版本的Qt允许写到类的"public"作用域中或者全局下返回值为void,需要声明,也需要实现可以有参数,可以发生重载发送信号。

2025-02-08 16:31:44 1230

原创 Qt:项目文件解析

Qt的对象树机制虽然在⼀定程度上解决了内存问题,但是也引入了⼀些值得注意的事情。这些细节在今后的开发过程中很可能时不时跳出来烦扰一下,所以最好从开始就养成良好习惯。

2025-02-08 15:11:13 1097

原创 Qt:Qt Creator项目创建

Qt 套件是指 Qt 程序从编译链接到运⾏环境的全部工具和 Qt 类库的集合,对于 MinGW 版本 Qt 程序生成和调试,至少需要 MinGW 中的编译器 g++(自动调用链接器)、g++ 配套的基础库、调试器 gdb 还有使用 MinGW 环境编译而成的 Qt 类库自身。打开Qt Creator,在菜单栏中选中"文件","新建文件或项目"或者使用快捷键Ctrl+n或者直接点击"new"。Qt官方声明,因市场原因,弃用Qbs。此处选择的语言是 "汉语","英语"这样的语言,而不是 "编程语言"

2025-02-08 10:43:26 1082

原创 Qt:Qt环境配置安装

Qt 支持多种开发工具,其中比较常用的开发工具有:Qt Creator、Visual Studio、Eclipse。总而言之,Qt Creator是⼀个功能齐全、易于使用且高效的跨平台IDE,适用于各种类型的应用程序开发,特别是那些使用Qt框架的开发者。Visual Studio是由微软公司开发的集成开发环境(IDE)。它可以用来开发多种类型的应用程序。包括Windows桌面应用程序、Web应用程序、移动应用程序、游戏等。

2025-02-06 21:20:02 1050

原创 Qt:Qt基础介绍

Qt是⼀个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供了建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展。Qt为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的应用程序,同时也可以使用C++语言进行高级开发。指采用图形方式显示的计算机操作用户界⾯,是计算机与其使用者之间的对话接口,是计算机系统的重要组成部分。如下分别是:Android手机图形用户界面和IOS手机图形用户界面。

2025-02-06 20:50:43 815

原创 【项目】基于Qt开发的音乐播放软件

该项目是仿QQ音乐客户端界面使用 Qt Creator 4.11.1 (Community) 实现的音乐播放器软件,在自学Qt课程时,敲的都是⼀些测试验证的小demo,知识点难以系统联系起来,通过做项目把自己学习过的Qt基础知识全部串联起来,融会贯通。综合运用UI界面设计其主要功能如下:点击窗口最小化按钮,窗口最小化点击窗口最大化按钮,窗口无反应(即禁止窗口最大化)点击关闭按钮,程序隐藏到任务栏中点击换肤按钮,更好皮肤(该功能暂未支持,后期可继续拓展)

2025-01-28 19:12:09 1180

原创 数据链路层——以太网协议

发起方构建ARP请求,以广播的方式发送给每一个主机。每台主机都能识别接收,然后根据MAC帧的帧类型字段将有效载荷交付给每个主机的ARP层。其他不相关主机立马根据目的IP,在自己的ARP协议内部丢弃ARP请求,只有目标主机会处理请求。

2025-01-21 14:47:56 670

原创 网络层——IP协议

因此一个数据在路由的时候,随着数据不断路由进入更小的子网,其网络号的位数是在不断变化的,准确来说其网络号的位数是在不断增加的,这也就意味着IP地址当中的主机号的位数在不断减少。需要注意的是,未分片报文的“更多分片”标志位为0,最后一个分片报文的“更多分片”标志位也为0,但当接收端只收到分片报文中的最后一个分片报文时,接收端不会将其识别成一个未分片的报文,因为未分片的报文所对应的13位片偏移的值也应该是0,而最后一个分片报文所对应的13位片偏移的值不为0。例如,下图中路由器连接了两个网段。

2025-01-21 14:29:01 786

原创 TCP协议

在进行网络通信时,一方发出的数据后,它不能保证该数据能够成功被对端收到,因为数据在传输过程中可能会出现各种各样的错误,只有当收到对端主机发来的响应消息后,该主机才能保证上一次发送的数据被对端可靠的收到了,这就叫做真正的可靠。实线表示该数据能够被对方可靠的收到,虚线则不能保证。但TCP要保证的是双方通信的可靠性,虽然此时主机A能够保证自己上一次发送的数据被主机B可靠的收到了,但主机B也需要保证自己发送给主机A的响应数据被主机A可靠的收到了。

2025-01-21 10:55:18 676

原创 UDP协议

因此UDP本身是会维护一个接收缓冲区的,当有新的UDP报文到来时就会把这个报文放到接收缓冲区当中,此时上层在读数据的时就直接从这个接收缓冲区当中进行读取就行了,而如果UDP接收缓冲区当中没有数据那上层在读取时就会被阻塞。因此UDP的接收缓冲区的作用就是,将接收到的报文暂时的保存起来,供上层读取。而socket接口往下的传输层实际就是由操作系统管理的,因此UDP是属于内核当中的,是操作系统本身协议栈自带的,其代码不是由上层用户编写的,UDP的所有功能都是由操作系统完成,因此网络也是操作系统的一部分。

2025-01-20 16:16:30 808

原创 HTTP协议

HTTP(Hyper Text Transfer Protocol)协议又被称为做超文本传输协议,是一种简单的请求-响应协议,HTTP通常运行在TCP之上在编写网络通信代码时,可以自行进行协议的定制,但实际有很多优秀的工程师早就已经写出了许多非常成熟的应用层协议,其中最典型的就是HTTP协议。

2025-01-20 15:43:51 781

原创 网络编程套接字(二)

由于调用pthread_create函数创建线程时,新线程的执行例程是一个参数为void*,返回值为void*的函数。若要将这个执行例程定义到类内,就需要将其定义为静态成员函数,否则这个执行例程的第一个参数是隐藏的this指针在线程的执行例程中会调用Service函数,由于执行例程是静态成员函数,静态成员函数无法调用非静态成员函数,因此需要将Service函数定义为静态成员函数,恰好Service函数内部进行的操作都不涉及类内数据的修改,因此直接在Service函数前面加上一个static即可。

2025-01-19 22:21:37 1031

原创 网络编程套接字(一)

因为服务器就是为了给别人提供服务的,因此服务器必须要让别人知道自己的IP地址和端口号,IP地址一般对应的就是域名,而端口号一般没有显示指明过,因此服务端的端口号一定要是一个众所周知的端口号,并且选定后不能轻易改变,否则客户端是无法知道服务端的端口号的,这就是服务端要进行绑定的原因,只有绑定之后这个端口号才真正属于自己,因为一个端口只能被一个进程所绑定,服务器绑定一个端口就是为了独占这个端口。需要注意的是,我们获取到的客户端的端口号此时是网络序列,我们需要调用ntohs函数将其转为主机序列再进行打印输出。

2024-09-28 23:21:36 1156

原创 网络基础认识

报头本质也是一种数据,报头一般是通过位段实现的,因此协议栈的每一层都有一个对应的位段来表示当前层的报头。

2024-09-28 21:35:31 1450

原创 C++11:线程库

由于thread提供了移动赋值函数,因此当后续需要让该线程对象与线程函数关联时,可以以带参的方式创建一个匿名对象,然后调用移动赋值将该匿名对象关联线程的状态转移给该线程对象。线程函数的参数是以值拷贝的方式拷贝到线程栈空间中的,就算线程函数的参数为引用类型,在线程函数中修改后也不会影响到外部实参,因为其实际引用的是线程栈中的拷贝,而不是外部实参。当线程函数的参数类型为引用类型时,如果要想线程函数形参引用的是外部传入的实参,而不是线程栈空间中的拷贝,那么在传入实参时需要借助ref函数保持对实参的引用。

2024-09-19 20:00:00 1140

原创 C++11:特殊类设计

只能在堆上创建对象,也就是只能通过new操作符创建对象。

2024-09-19 15:22:55 1019

原创 C++11:异常与智能指针

实际中很多公司都会自定义自己的异常体系进行规范的异常管理。公司中的项目一般会进行模块划分,让不同的程序员或小组完成不同的模块,如果不对抛异常这件事进行规范,那么负责最外层捕获异常的程序员就非常难受了,因为他需要捕获大家抛出的各种类型的异常对象。因此实际中都会定义一套继承的规范体系,先定义一个最基础的异常类,所有人抛出的异常对象都必须是继承于该异常类的派生类对象,因为异常语法规定可以用基类捕获抛出的派生类对象,因此最外层就只需捕获基类就行了。

2024-09-17 23:45:00 1197

原创 C++11

在2003年C++标准委员会提交了一份技术勘误表(简称TC1),使得C++03这个名字取代了C++98成为C++11之前的最新C++标准名称。但由于C++03主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把这两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准姗姗来迟。

2024-09-17 18:48:33 1372

原创 【项目】高并发内存池

本项目实现的是一个高并发的内存池,原型是Google的一个开源项目tcmalloc,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替换系统的内存分配相关函数malloc和free。tcmalloc的知名度也是非常高的,不少公司都在用它,比如Go语言就直接用它做了内存分配器。本项目是将tcmalloc最核心的框架简化后拿出来,模拟实现出一个高并发内存池,目的是为了学习tcamlloc的精华。

2024-09-14 11:09:24 1106

原创 C++:位图/布隆过滤器+海量数据处理

构造一个16位的位图,所有位都初始化为0。构造一个16位的位图,根据所给值初始化位图的前n位。构造一个16位的位图,根据字符串中的0/1序列初始化位图的前n位。

2024-08-31 23:00:00 1233

原创 C++:unordered_map和unordered_set模拟实现

现在由于我们在哈希结点当中存储的数据类型是T,这个T可能就是一个键值,也可能是一个键值对,对于底层的哈希表来说,它并不知道哈希结点当中存储的数据究竟是什么类型,因此需要由上层容器提供一个仿函数,用于获取T类型数据当中的键值。但遗憾的是,我们无法找到一种能实现字符串和整型之间一对一转换的方法,因为在计算机中,整型的大小是有限的,比如用无符号整型能存储的最大数字是4294967295,而众多字符能构成的字符串的种类却是无限的。因为哈希表当中存储的结点都是new出来的,因此在哈希表被析构时必须进行结点的释放。

2024-08-31 17:41:42 1197

原创 Linux:Linux线程池

五个线程在处理时会呈现出一定的顺序性,因为主线程是每秒Push一个任务,五个线程中只会有一个线程获取到该任务,其他线程都会在等待队列中进行等待,当该线程处理完任务后就会因为任务队列为空而排到等待队列的最后,当主线程再次Push一个任务后会唤醒等待队列首部的一个线程,这个线程处理完任务后又会排到等待队列的最后,因此这五个线程在处理任务时会呈现出一定的顺序性(2-3-4-5-1)由于系统调用接口过于复杂,线程模块完成的便是线程的封装,降低接口的调用复杂度,提高代码的阅读性并提高代码的复用性。

2024-08-24 09:51:51 1136

原创 Linux:Linux信号量

当执行流在申请信号量时,可能此时信号量的值为0,也就是说信号量描述的临界资源已经全部被申请了,此时该执行流就应该在该信号量的等待队列当中进行等待,直到有信号量被释放时再被唤醒。多个执行流为了访问临界资源会竞争式的申请信号量,因此信号量是会被多个执行流同时访问的,也就是说信号量本质也是临界资源。但信号量本质就是用于保护临界资源的,我们不可能再用信号量去保护信号量,所以信号量的PV操作必须是原子操作。信号量的初始值为1,说明信号量所描述的临界资源只有一份,此时信号量的作用基本等价于互斥锁。

2024-08-22 19:55:53 996

原创 Linux:生产者消费者模型

生产者和消费者彼此之间不直接通讯,而通过这个容器来通讯,所以生产者生产完数据之后不用等待消费者处理,直接将生产的数据放到这个容器当中,消费者也不用找生产者要数据,而是直接从这个容器里取数据,这个容器就相当于一个缓冲区,平衡了生产者和消费者的处理能力,这个容器实际上就是用来给生产者和消费者解耦的。仍然让生产者生产快,消费者消费慢。运行代码后生产者还是一瞬间将阻塞队列装满后进行等待,但此时不是消费者消费一个数据就唤醒生产者线程,而是当阻塞队列当中的数据小于等于队列容器的一半时,才会唤醒生产者线程进行生产。

2024-08-22 19:23:43 996

原创 Linux:Linux线程安全

因为该执行流第一次申请锁的时候是申请成功的,但第二次申请锁时因为该锁已经被申请过了,于是申请失败导致被挂起直到该锁被释放时才会被唤醒,但是这个锁本来就在自己手上,自己现在处于被挂起的状态根本没有机会释放锁,所以该执行流将永远不会被唤醒,此时该执行流也就处于一种死锁的状态。临界区内的线程完全可能进行线程切换,但即便该线程被切走,其他线程也无法进入临界区进行资源访问,因为此时该线程是拿着锁被切走的,锁没有被释放也就意味着其他线程无法申请到锁,也就无法进入临界区进行资源访问了。由于只有一条指令,保证了原子性。

2024-08-22 17:52:37 846

原创 Linux:Linux多线程

在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

2024-08-22 16:35:58 1350

原创 Linux:Linux进程信号

在云服务器中,核心转储是默认关闭的,可以使用。

2024-08-10 11:37:38 1056

原创 Linux:Linux进程间通信

对于管道的场景来说,互斥就是两个进程不可以同时对管道进行操作,它们会相互排斥,必须等一个进程操作完毕,另一个才能操作,而同步也是指两个进程不能同时对管道进行操作,但这两个进程必须要按照某种次序来对管道进行操作。消息队列实际上就是在系统当中创建了一个队列,队列中每个成员都是一个数据块,这些数据块都由类型和信息两部分构成,两个互相通信的进程通过某种方式看到同一个消息队列,这两个进程向对方发数据时,都在消息队列的队尾添加数据块,这两个进程获取数据块时,都在消息队列的队头取数据块。

2024-08-05 20:34:06 986

原创 Linux:Linux文件系统

在我们的磁盘上,有大量的文件存储着,这批文件非常的多、杂、乱操作系统对这些文件的管理的部分叫做文件系统在Linux_文件系统(内存)一文中我们了解了文件描述符、重定向、缓冲区等应用级概念,这些都是从内存中看待文件的方式,如果想更全面的了解Linux的文件系统,必须从内存中出来了解物理磁盘是什么样的,存储单元是什么样,操作系统如何看待磁盘从磁盘中一步步走到内存,把知识从想象变为实体。

2024-07-31 20:33:35 978

原创 Linux:Linux文件IO

打开一个文件–>fopen()关闭一个文件–>fclose()对文件进行写入–>fwrite()对文件进行读取–>fread()具体这些函数的使用,可以通过这篇文章回顾一下C语言—文件操作总体看,这套文件操作的使用逻辑就是:打开一个文件,对文件进行操作,关闭这个文件;为了让操作的时候能找到这个文件,C语言提供了一个FILE*的结构体指针,里面存着可以找到文件的成员变量,打开文件的同时返回这样一个指针,之后的对FILE*的操作即使对文件的操作。

2024-07-31 17:26:19 772

原创 Linux:Linux进程控制

为什么要这么多接口呢?适配不同的使用情况事实上,只有execve是真正的系统调用,其他最终都会调用execve,所以只有execve是在man手册的第2页,其它都是第3页。

2024-07-23 17:06:42 1179

原创 Linux:Linux进程概念

在讲解进程之前,我们需要先铺垫一些计算机硬件、操作系统的知识,进而丝滑的理解进程的概念,然后再通过进程切入,从而理解操作系统。1. 冯诺依曼体系结构1.把需要的程序和数据送至计算机中。2.必须具有长期记忆程序、数据、中间结果及最终运算结果的能力。3.能够完成各种算术、逻辑运算和数据传送等数据加工处理的能力。4.能够按照要求将处理结果输出给用户。1.输入数据和程序的输入设备;(键盘、磁盘、网卡、显卡、话筒、摄像头等)2.输出处理结果的输出设备。(显示器、磁盘、网卡、显卡、音响等)

2024-07-21 13:58:07 818

空空如也

空空如也

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

TA关注的人

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