- 博客(41)
- 收藏
- 关注
原创 Qt 窗口 (菜单 工具栏 状态栏 浮动窗口 对话框)
若要给浮动窗口内部,添加一些其它控件,不能直接给这个浮动窗口添加子控件,而是创建出一个单独的QWidget,把添加的控件加入到QWidget中。不同于界面上的其他控件,此处 QDialog 每次按下按钮,都会创建一个新的 QDialog 对象,并进行显示,每次点击都会创建的新的对话框对象!在实际开发中,往往不是直接在创建项目时继承自QDialog,而是在代码中,创建额外的类,让额外的类继承自QDialog。当然,如果窗口关闭了,对象树释放,进程结束了,操作系统会把所有的内存回收,内存泄漏就不会产生影响。
2026-03-13 14:26:20
399
原创 Qt (按钮/显示/输入/容器类控件 布局管理器)
Qt 中封装了对应的定时器:QTimer 通过这个类创建出来的对象,会产生timeout的信号,通过start开始,并且能在start中参数设定多少ms触发一次timeout信号。之前使⽤Qt在界⾯上创建的控件,都是通过"绝对定位"的⽅式来设定的。对于GUI来说,内部包含了很多的隐藏状态,Qt 为了保证修改界面的过程中,线程的安全会受到影响,Qt禁止了其它线程直接修改见面。我们可以看到按钮5虽然是(100,100)但和按钮4没有拉的很远,说明此处设置的行数和列数,只是用来决定控件之间的相对位置。
2026-03-07 20:15:42
416
原创 stm32 (GPIO 外部中断 TIM定时中断输出比较输入捕获)
原理:ARR 决定了 PWM 的周期。我们先思考这一个问题,因为时钟要精确到纳秒,时钟所需要的频率是很高,所以TIMXCLK要高频,而我们需要用APB1传递数据的外设,所需要的传递的速率没必要达到这么高,硬件处理不过来,并且高频容易发热等负面BUFF,没必要,所以要降频。答:CNT像一个时钟,一直在循环计数,当输入引脚引起电平跳变,发生外部中断,这是一个瞬间的过程,为了准确的测量其中的时间,需要把当前的“钟表时间”(CNT值)保存下来。(如果都用高频率,就会缺电,因为嵌入式的功率是有限的,并且会发烫)
2026-02-28 22:20:58
613
原创 #pragma once 与 前置声明
例子:假如QTimer.h 有 5,000 行代码,项目有 50 个源文件 需要用到 QTimer*我不需要读完《Qt编程指南》整本书,只需要知道书名叫’QTimer’就够了,等需要具体内容时再读。而#pragma once是预处理层面做到事情,防止代码层面的重复包含。先说#pragma once的作用,防止重复包含(同一文件多次展开)前置声明解决的不是文件重复包含,而是避免不必要的类型定义重复展开。如果没了前置声明,每次类要用到都要展开,是编译层面上的展开。
2026-02-07 11:44:08
391
原创 Qt (信号与槽 Widget控件 qrc文件)
上面的例子是Qt自己内置的,有时自己的需求在Qt中是没有的,就需要自定义信号与自定义槽。自定义槽:一个普通的自定义函数。第一种定义槽函数的方法,例子:在以前的Qt中,槽函数必须放到public/private/protected slots:此处slots是Qt自己扩展的关键字(不是C++标准中的语法),因为Qt里广泛使用元编程(基于代码,生成代码),qmake构建Qt项目的时候,会调用专门的扫描器,扫描到特定的关键字(比如slots…),基于关键字自动生成一大堆相关的代码。
2026-02-04 23:24:54
989
原创 Qt安装(对象树、乱码文通、快捷键)
Qt诞生于1991年,当时没C++标准库,表示字符串用C的字符串风格(\0结尾)和C++的string,都不好用,Qt就自己搞了一套基础类,来支持自己Qt的开发:包括QVector、QList…构建系统:Qt框架会在编译的时候,自动调用一系列的生成工具,基于自己的代码,生成一系列的C++代码,这才是最总编译的代码,下面这些就是生成的工具,常使用qmake。(越灵活,越自由,就容易出错,所以就有了框架去限制)回答具体的数一定是错的。但在Qt原生的api中,涉及到的接口,用的都是Qt自己的这一套容器。
2026-01-29 20:08:01
952
原创 MySQL安装与基础操作指南
mysql本质上是一种网络服务:1.mysql是数据库服务的客户端。2.mysqld它是数据库服务的服务端。3.mysql本质:基于C(mysql)S(mysqld)模式的一种网络服务。发现其绑定的端口号就是3306:mysql是一套提供数据存取的网络服务的网络程序。口语上的数据库一般指的是:在磁盘或内存中存储的特定结构组织的数据 – 将来在磁盘上存储的一套数据库方案。数据库服务特质的是:mysqld。存储数据有文件就可以了,为什么还要有数据库?
2026-01-21 10:57:00
557
原创 C语言中 宏do while(0) 与 可变参数
先看这一段语句,为什么要这样写,而不能用while(),for这种循环。我们会发现,没有分号的多余。首先我们在主函数中的do while(0)后是必须加。
2026-01-15 10:47:19
45
原创 前端入门(CSS引入方式、选择器、字体属性、背景属性、元素显示模式、盒模型)
CSS能够对网页中元素进行排版进行控制,美化页面的效果。CSS控制的是页面的展示效果。html决定页面结构。比如这个索引是蓝色背景:写在style标签中,嵌入到html内部。(理论上style放到html哪里都行,但是一般都是放到head标签中)代码中40px表示的是40像素,不加默认为16px。效果:跟C语言中函数的缺省参数差不多:效果:发现:行内优先级比内部样式表优先级高代码:(相当于函数)以下是CSS2标准支持的选择器。由单个选择器构成的。这就是一个最简单的标签选择器(p标
2026-01-07 09:47:03
564
原创 html基础
用的VScode,官网上直接下载。下面是3个常用的插件。鼠标右键:点击后:鼠标右键:运行后发现本地环回:两边信息就会同步(输入完后别忘了保存才能刷新)不规范的,但能用:点击后:规范的:DOM树:每一个标签相当于一个节点,节点组合起来就是一颗DOM树。所有的标签都是html的子标签。head和body是兄弟标签(可以由图看到他的行缩进是一样的)。head和title是父子标签。每一个标签相当于一个对象,程序员通过代码可以拿到这些对象,拿到后可以对对象增删查改。代码运行现象:
2025-12-26 16:33:27
614
原创 Linux网络基础(协议 TCP/IP 网络传输基本流程 IP VS Mac Socket编程UDP)
一开始时,计算机都相互独立,只能通过软盘,才能把数据交给另一台计算机后面因为效率原因,就有了服务器,都从服务区上拿数据美国一开始有贝尔实验室、麻省理工实验室…一开始实验室各搞各的,所以局域网有很多种类的以太网、令牌网…新技术的产生,一定产生了新设备(芯片技术应用到笔记本,就叫做计算机;用到汽车上,就叫做智能汽车),所以计算机的发展,肯定伴随着新的设备(比如网络通信,得有网线)1994年中国进入互联网,不仅让腾讯阿里发展很好,华为和其它通信的公司也发展起来。
2025-02-26 19:37:14
1361
原创 多线程(线程控制 封装线程 线程互斥 线程同步 生产消费模型 信号量)
文章目录一.背景知识再谈地址空间二.线程pthread_create为什么线程的调度成本更低?线程的优点线程的缺点线程与进程的区别共享每个线程独一份三.线程控制线程的创建与等待等待线程pthread_join线程创建的传参arg线程创建的返回值与等待线程的参数retval创建多个线程新线程如何终止线程的分离四.浅谈C++11下的线程五.再谈tid线程的局部存储六.封装线程七.线程互斥认识锁与接口RAII风格锁原理角度理解锁锁是如何实现上锁解锁八.线程同步条件变量&&接口认识条件变量使用接口生
2024-12-16 11:03:50
864
原创 进程信号(信号产生 信号保存 信号捕捉 可重入函数 volatile SIGCHLD信号)
如果不想执行上述的默认动作,让进程执行我们自己设计的信号处理方式,就是自定义处理。用到函数调用:signal对信号的自定义捕捉,我们只要捕捉一次,后续一直有效先看现象:对2号信号进行捕捉int main()//对信号的自定义捕捉,我们只要捕捉一次,后续一直有效sleep(1);return 0;发现发送二号信号,会被捕捉。发送三号信号,会终止进程。如果一直不产生2号信号,handler方法一直不会被调用。return 0。
2024-11-04 19:52:38
1030
原创 进程间通信(命名管道 共享内存)
假设A进程在物理内存中创建一段内存空间,然后在A进程的地址空间中的共享区申请一片空间,再把虚拟地址与共享内存的映射关系填入页表。所以磁盘中有个特殊文件,在内存中写入不会刷新到磁盘,让两个进程在内存中通信,该文件叫做命名管道。说明对于读端而言,如果我们打开文件,但还没有写端,就会阻塞在open调用中,直到对方打开。2.AB进程通信,CD进程也要通信,所以共享进程在系统中可以存在很多份,且功能也不一样。写入的时候,管道的大小依旧为0。perms是共享内存的权限:如果创建的时候,加上权限,perms的值会更改。
2024-11-03 20:33:06
748
原创 进程间通信(匿名管道 pipe 创建管道及分配任务代码)
管道的4种状态:1.如果管道内部是空的 && write的wfd(写端)没有关闭,读取条件不具备,读进程会被阻塞,等待读取的条件具备。2.如果管道被写满 && read的rfd(读端)不读且没有关闭,写进程会被阻塞(管道被写满–>写条件不具备),等待写条件具备。3.管道一直在读 && write的wfd(写端)关闭了,读端read返回值==0,表示读到了文件结尾。4.read的rfd(读端)直接关闭 && write的wfd(写端)一直在进行写入。
2024-10-07 15:59:01
897
原创 文件系统(软硬链接 动静态库 动态库加载的过程)
故事:你在学校的宿舍比如是513的2号床(物理地址),学号是111(虚拟地址),线下找你肯定是拿着宿舍的地址找你,校方线上查看档案肯定是拿着学号找。总结动态库加载的过程:可执行程序先加载内存中,运行到需要调用库的地方,如果库不在,就缺页中断,根据路径找到库加载进来,通过映射得到我的库的起始地址,库的地址+偏移量找到方法(函数)。只有物理地址是无法使用的,需要mm_struct中的栈和堆之间开辟一段空间(因为物理内存中已经有库了,所以开辟多少空间的大小也是确定的)填入库的虚拟地址,然后与页表建立映射关系。
2024-09-23 16:13:51
1072
原创 文件系统(磁盘 磁盘文件 inode)
然后在inode Bitmap找位图,从低向高找,看哪个为0,给我们分配的新的偏移量+新分配的inode编号就是新的inode,根据新的inode号在inode Table里把属性一写。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。inode编号是以分区为单位分配的,一个分区的inode号是不能重复的。我们平时访问时都用的文件名。
2024-09-10 16:37:45
1282
原创 文件系统(文件描述符fd 重定向原理 缓冲区 stderr)
这三个常量,必须指定一个且只能指定一个O_RDONLY只读O_WRONLY只写O_RDWR读写O_CREAT若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_TRUNC清空后写入O_APPEND追加写。
2024-09-07 20:01:42
835
原创 进程终止(exit && _exit) 进程等待(wait && waitpid) 进程替换(execv)
return -1;运行之后,输出是-1。不知道是因为除0的原因导致结果为-1还是相除本身结果是-1说明光靠打印结果(数字),是看不清涵义。//自定义枚举常量enumDiv_Zero,Mod_Zero,return -1;elseint main()这样就知道是因为什么退出了,退出码为1,说明除零了我们不适合面对数字,更适合直观的语言,所以再写一个接口//自定义枚举常量enumDiv_Zero,
2024-08-28 21:48:48
878
原创 命令行参数和环境变量
export [环境变量名]=[环境变量的内容]当然,这个环境变量也是内存级的,写在bash中的,真想让其生效应该在配置文件改取消环境变量unset [环境变量名]
2024-08-11 18:01:15
788
原创 Linux进程 (冯诺依曼体结构 管理 PCB 进程状态 僵尸进程 孤儿进程 运行阻塞挂起状态 进程优先级)
冯诺依曼体系结构,PCB,僵尸进程,孤儿进程,运行阻塞挂起状态
2024-08-01 15:51:03
857
原创 Linux编译器-gcc/g++使用 make/makefile最基础的功能 Linux调试器-gdb的使用
引例:从零开始写代码,假设设计一个printf函数,设计好了大半个月过去了,效率比较低,所以语言设计者把一些公共的方法抽取出来,放进自己的标准库。提高可移植性,比如直接把二进制代码从这个A机器到B机器,跨平台性提高,不依赖动态库,不用做过多的环境监测。查看静态库的指令(mytest-static是形成test.c静态库的名称,名字随便取)查看画横线的文件,没形成C语言库之前就是C语言的源代码,被顶级程序员打包成库。引例:同样一种软件,有社区版,专业版,免费版。gcc默认形成的可执行程序,默认采用动态链接。
2024-06-21 14:32:40
2382
3
原创 Linux编辑器 vim使用 (解决普通用户无法进行sudo提权问题)
但是再次进入的时候会发现还是这个界面:是因为这个文件里面可能有别的用户保存的数据,所以vim在自己被删掉或者异常崩溃的时候,他就会默认在当前目录下形成一份临时文件,这个临时文件就是为了方便我们恢复。然后按住j可以批量化选中,也可以按住shift + g = G全部选中,也可以n + j(n为行数)用过VS的都知道,拥有着编辑器编译器调试.编写C+++,C,python等的功能。先ctrl + v ,用hjkl进行选择,然后包含//,按d删了即可。E一下就可以,但是每次进来就会着这种提示,很烦,怎么办?
2024-06-13 12:14:49
1262
原创 Linux 软件包管理器 yum
yum会根据/etc/yum.repos.d/该路径下面的配置文件,来构建自己的下载链接,(根据OS版本,根据你要下载的软件),yum帮助我们下载,安装。Linux中的安装包是有依赖关系的(比如下载游戏的时候有各种文件,文件之间的关系)–yum就是解决安装包之间的关系。所以,重点来了:一个系统的开发者,肯定知道为什么大家都选择这个系统,所以才努力维护更好,让大家都选择我。假设一个系统的出现,就只有一个系统,没个讨论,没个官网,有个bug,找谁去?ubuntu,centos等底层用的都是一样的源代码。
2024-06-11 21:20:15
759
原创 多态(C++)
引例:下面代码会输出多少,在x86的环境下class Basepublic:private:int _b = 1;是12实例化一个对象,通过调试看以下有个指针,叫做虚函数表指针,简称虚表指针(只要有虚函数就有这个)以下面这串代码为例class Basepublic:private:int _b = 1;return 0;通过调试我们可以看出这个东西是用来实现多态的。
2024-05-16 17:06:44
629
原创 继承(C++)
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用引例:学生老师都有名字年龄,如果分别分装到别的类就显得冗余,就有了继承例子代码:父类成员,继承到派生类以后,访问权限是什么呢?
2024-05-09 21:56:41
896
原创 模板(C++)
这里类模板不能推演实例化了,只能显示实例化,因为没有传参的问题,所以无法推演类型,只能自己指定,并且str1与str2两个类不是同一个类。答案是完全不一样的,因为浮点型和整型的存储方式都不一样,交换方式肯定不一样。其中typename是关键字,也可以拿class代替,T是名字,取啥都行。下面调用模板的方式不可取:两个类型不同,却用的同一个T类型,有歧义。根据每次交换类型的不同,函数就不同很麻烦,所以祖师爷发明了模板。2.有现成的,但是不够匹配的,有模板,就会选择自己实例化模板。1.有现成,吃现成的(匹配)
2024-03-30 16:59:28
507
原创 new/delete(C++)
new在创建自定义类型时,开空间+构造函数public:,_val(val){}//创建不带哨兵位的//哨兵位,但是是局部变量,出了域会自动销毁printf("一次输入%d个节点的值:", n);i < n;相比较C语言简洁很多,而且不用手动检查,new失败了以后会抛异常int n = 0;while (1)//这里是1024字节 = 1KBn++;
2024-03-28 12:22:00
721
原创 类与对象(C++)
/类体:由成员函数和成员变量组成//这里分号要注意class为类定义的关键字,ClassName为类的名字,{}中为类的主体这里说以下类体的命名习惯:引例:这里初始化赋值的时候year=year不知道哪个是哪个class Dateint year;所以在成员变量前面加个_就更好区分(C++语法里面没有规定,只是个人习惯)class Dateint _year;然后运行的时候你就会发现调用不动函数。
2024-03-16 20:23:07
1788
1
原创 C++入门
命名空间的使用方法有三种:int main()return 0;2.使用using将命名空间中某个成员引入using N::b;3.使用using namespace 命名空间名称 引入int main()return 0;
2024-02-18 17:16:42
1976
1
原创 快速排序三种常见的方法与非递归的形式
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法其基本思想为:任取待排序元素序列中的某元素作为基准值(key),按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值(key),右子序列中所有元素均大于基准值(key),然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。快排时间不够,所以会超出时间限制,知道写没写对即可。
2024-01-18 20:10:58
453
1
原创 直接插入排序和希尔排序
基本思想是:先选定一个整数(设为grap),把待排序文件中所有元素分成grap个组,所有距离为grap的元素分在同一组内,并对每一组内的元素进行排序。然后,再取一个比grap小的整数,重复上述分组和排序的工作。步骤:插入第i个元素的时候,从i-1开始依次向左边比较,直到出现比第i个元素小的停止,假设该元素是第j个,那么第i个元素进行。当grap==1的时候很接近有序,所以直接插入就很快,在下面做了速度对比。代码如下:(技巧:先写一次排序的,然后再写多次排序)画个图:(用相同颜色链接的线就为同一组)
2023-12-24 21:09:36
447
1
原创 C语言中多个三目操作符如何运算
我是在这一道题上看到一个解的方案感觉挺有趣:给的解是:运用了三个三目操作符。来让我们回想一下三目操作符:先说结论:?: 从左往右运算?:跟相近的相关。
2023-10-25 20:37:00
1012
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅