- 博客(62)
- 收藏
- 关注
原创 从0到1学习Qt -- 常见控件之显示类控件
updateProgressBar 函数. 修改 widget.cpp, 初始化 QTimer,此处设置 100ms 触发⼀次 timeout 信号. 也就是⼀秒钟触发 10 次.第四个 label 设置了 margin, 四个⽅向均有间距(图上仅体现出三个⽅向, 下⽅看不出来).3) 运⾏程序, 可以看到, 按下快捷键 alt + a 或者 alt + b, 即可选中对应的选项.3) 执⾏程序, 可以看到当选择不同的⽇期时, label 中的内容就会随之改变.
2025-11-27 22:46:55
1104
原创 从0到1学习Qt -- 常见控件QWidget(三)
cursor()获取到当前 widget 的 cursor 属性, 返回 QCursor 对象.当⿏标悬停在该 widget 上时, 就会显⽰出对应的形状.设置该 widget 光标的形状. 仅在⿏标停留在该 widget 上时⽣效.cursor设置全局光标的形状. 对整个程序中的所有 widget 都会⽣效. 覆盖上⾯的 setCursor 设置的内容.
2025-11-25 19:19:32
656
原创 从0到1学习Qt -- 常见控件QWidget(二)
获取到控件的窗⼝标题设置控件的窗⼝标题注意!上述设置操作针对不同的 widget 可能会有不同的⾏为.如果是顶层 widget (独⽴窗⼝), 这个操作才会有效.如果是⼦ widget, 这个操作⽆任何效果.
2025-11-12 18:40:35
907
原创 从0到1学习Qt -- 常见控件QWidget(一)
Widget 是 Qt 中的核⼼概念. 英⽂原义是 "⼩部件", 我们此处也把它翻译为 "控件"。控件是构成⼀个图形化界⾯的基本要素。按钮, 列表视图, 树形视图, 单⾏输⼊框, 多⾏输⼊框, 滚动条, 下拉框等, 都可以称为 "控件"。Qt 作为⼀个成熟的 GUI 开发框架, 内置了⼤量的常⽤控件. 这⼀点在 Qt Designer 中就可以看到端倪.并且 Qt 也提供了 "⾃定义控件" 的能⼒, 可以让程序猿在现有控件不能满⾜需求的时候, 对现有控件做出扩展, 或者⼿搓出新的控件.
2025-11-09 16:44:33
865
原创 从0到1学习Qt -- 信号和槽(二)
在 teacher.h 中声明信号函数:1. 自定义信号只要进行声明,Qt自动生成自定义信号的定义,而自定义槽函数要进行声明和定义2. 自定义信号要在前面加上关键字:signals,自定义槽函数可以加上public slots 或者 public3. 当我们connect的时候要注意信号的发送对象和接收信号的对象。
2025-11-06 21:33:11
583
原创 从0到1学习Qt -- 信号和槽(一)
在Qt中用户和Qt控件的每一次交互被称为一次事件。⽐如 "用户点击按钮" 是⼀个事件,"用户关闭窗⼝" 也是⼀个事件。每个事件都会发出⼀个信号,例如⽤⼾点击按钮会发出 "按钮被点击" 的信号,⽤⼾关闭窗⼝会发出 "窗⼝被关闭" 的信号。Qt 中的所有控件都具有接收信号的能⼒,⼀个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。例如,按钮所在的窗⼝接收到 "按钮被点击" 的信号后,会做出 "关闭⾃⼰" 的响应动作;
2025-10-29 10:45:52
915
1
原创 从0到1学习Qt -- 内存管理与乱码问题
在上篇文章中,通过代码的方式来实现在对话框中输出Hello World。但是我们在构造函数 new 完一个对象之后,并没有进行析构那么不会造成资源泄露问题吗?答案是不会的,因为Qt中存在对象树,可以自动的对我们new出来的对象进行管理。
2025-10-19 17:16:01
823
原创 从0到1学习Qt -- 创建第一个Hello World项目
项目命名和路径选择Build System的选择Class Information的选择后面一直按下一步就行。
2025-10-18 10:47:39
415
原创 线程规则的制定者二:线程安全与冲入问题
摘要:本文探讨了线程安全与重入问题。线程安全指多线程访问共享资源时能正确执行,不互相干扰;重入指函数被不同执行流重复进入,若结果一致则为可重入函数。线程不安全常见于共享变量未保护、返回静态指针等情况;线程安全则要求对全局变量只读或原子操作。可重入函数需避免使用全局变量、静态数据等。文章还分析了死锁的四个必要条件,并给出避免方法。最后讨论了STL容器和智能指针的线程安全性,指出STL默认非线程安全,shared_ptr需原子操作保证引用计数的线程安全。
2025-07-16 21:13:20
869
原创 线程世界的规则制定者一:互斥锁与条件变量详解
进程线程间的互斥相关背景概念共享资源临界资源:多线程执⾏流被保护的共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有且只有⼀个执⾏流进⼊临界区,访问临界资源,通常对临界资源起保护作⽤原⼦性(后⾯讨论如何实现):不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成。
2025-07-12 16:24:03
926
原创 Linux线程机制揭秘:从内核实现到用户态编程(二)
与线程有关的函数构成了⼀个完整的系列,绝⼤多数函数的名字都是以“pthread_”打头的要使⽤这些函数库,要通过引⼊头⽂链接这些线程函数库时要使⽤编译器命令的“-lpthread”选项。
2025-05-28 20:26:06
1009
原创 Linux线程机制揭秘:从内核实现到用户态编程(一)
在⼀个程序⾥的⼀个执⾏路线就叫做线程(thread)。更准确的定义是:线程是“⼀个进程内部的控制序列”。⼀切进程⾄少都有⼀个执⾏线程。线程在进程内部运⾏,本质是在进程地址空间内运⾏。在Linux系统中,在CPU眼中,看到的PCB都要⽐传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的⼤部分资源,将进程资源合理分配给每个执⾏流,就形成了线程执⾏流。
2025-05-15 10:45:12
599
原创 用户态到内核态:Linux信号传递的九重门(二)
实际执⾏信号的处理动作称为信号递达(Delivery)。信号从产⽣到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞 (Block )某个信号。被阻塞的信号产⽣时将保持在未决状态,直到进程解除对此信号的阻塞,才执⾏递达的动作。
2025-05-12 16:37:26
754
原创 进程的悄悄话:Linux IPC技术大揭秘(二)
共享内存区是最快的IPC形式。⼀旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执⾏进⼊内核的系统调⽤来传递彼此的数据。1.1. 共享内存的示意图。
2025-05-08 17:39:13
786
原创 进程的悄悄话:Linux IPC技术大揭秘(一)
数据传输:⼀个进程需要将它的数据发送给另⼀个进程。资源共享:多个进程之间共享同样的资源。通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发⽣了某种事件(如进程终⽌时要通知⽗进程)。进程控制:有些进程希望完全控制另⼀个进程的执⾏(如Debug进程),此时控制进程希望能够拦截另⼀个进程的所有陷⼊和异常,并能够及时知道它的状态改变。
2025-04-22 18:51:41
918
原创 Linux程序诞生记:ELF的链接、加载与执行三部曲
要理解编译链链接的细节,我们不得不了解⼀下ELF⽂件。:即 xxx.o ⽂件。包含适合于与其他⽬标⽂件链接来创) :即 xxx.so⽂件。) :即可执⾏程序。,存放当前进程的执⾏上下⽂,⽤于dump信号触发。⼀个ELF⽂件由以下四部分组成:Section Header Table(节头表):包含对。最常见的节:代码节(.text):⽤于保存机器指令,是程序的主要执⾏部分。数据节(.data):保存的全局变量和局部静态变量。
2025-04-14 13:22:51
713
原创 Linux中动静态库的制作
库是写好的现有的,成熟的,可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个⼈的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是⼀种可执⾏代码的⼆进制形式,可以被操作系统载⼊内存执⾏。库有两种:静态库:.a[Linux]动态库:.so[Linux] .dll[windows]
2025-04-02 21:55:30
1241
原创 Ext2文件系统探秘:从磁盘结构到Linux的基石设计
扇区:是磁盘存储数据的基本单位,512字节,属于块设备。如何定位一个扇区呢?确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)。定位磁头(header)。定位⼀个扇区(sector)。CHS地址定址:⽂件 = 内容+属性 都是数据,⽆⾮就是占据那⼏个扇区的问题!能定位⼀个扇区了,能不能定位多个扇区呢?扇区是从磁盘读出和写⼊信息的最⼩单位,通常⼤⼩为512字节。磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头。
2025-03-27 10:10:35
874
原创 什么说一切皆文件?Linux I/O 抽象的魅力(二)
openman openpathname: 要打开或创建的⽬标⽂件flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问权限O_APPEND: 追加写返回值:成功:新打开的⽂件描述符失败:-1。
2025-03-26 17:42:15
691
原创 算法通关计划:1.前缀和:秒杀数组区间求和的算法利器
前缀和(Prefix Sum) 是一种通过 预处理数组 来快速计算 任意区间和 的算法技巧。其核心思想是通过空间换时间,将区间和查询的时间复杂度从 O(n) 优化到 O(1)。下面以一个题目来具体见识一下一维前缀和的模板:DP34 【模板】前缀和3. 二维前缀和模板 下面以一个题目来具体见识一下二维前缀和的模板:DP35 【模板】二维前缀和3.前缀和的相关题目1.724. 寻找数组的中心下标2.238.除自身之外数组的乘积
2025-03-24 12:24:23
354
原创 为什么说一切皆文件?Linux I/O 抽象的魅力(一)
⽂件在磁盘⾥。磁盘是永久性存储介质,因此⽂件在磁盘上的存储是永久性的。磁盘是外设(即是输出设备也是输⼊设备)。磁盘上的⽂件本质是对⽂件的所有操作,都是对外设的输⼊和输出 简称 IO。
2025-03-18 12:23:30
392
原创 Linux进程观:简单性如何成就强大性(六)
fork()之后,⽗⼦各⾃执⾏⽗进程代码的⼀部分如果⼦进程就想执⾏⼀个全新的程序呢?进程的程序替换来完成这个功能!程序替换是通过特定的接⼝,加载磁盘上的⼀个全新的程序(代码和数据),加载到调⽤进程的地址空间中!1.1. 替换原理⽤fork创建⼦进程后执⾏的是和⽗进程相同的程序(但有可能执⾏不同的代码分⽀),⼦进程往往要调⽤⼀种exec函数以执⾏另⼀个程序。当进程调⽤⼀种exec函数时,该进程的⽤⼾空间代码和数据完全被新程序替换,从新程序的启动例程开始执⾏。
2025-03-12 22:44:12
306
原创 Linux的进程观:简单性如何成就强大性(五)
在linux中fork函数是⾮常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程,⽽原进程为⽗进程。进程调⽤fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给⼦进程。将⽗进程部分数据结构内容拷⻉⾄⼦进程。添加⼦进程到系统进程列表当中。fork返回,开始调度器调度。当⼀个进程调⽤fork之后,就有两个⼆进制代码相同的进程。⽽且它们都运⾏到相同的地⽅。但每个进程都将可以开始它们⾃⼰的旅程,
2025-03-10 16:26:57
1053
原创 Linux的进程观:简单性如何成就强大性(四)
程序地址空间是操作系统为进程分配的虚拟内存区域,包含代码、数据、堆、栈等,通过映射机制隔离物理内存,实现进程独立运行与资源保护。
2025-03-06 11:01:35
812
原创 Linux的进程观:简单性如何成就强大性(三)
环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器⾏查找。环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性。
2025-03-03 22:58:22
999
原创 Linux的进程观:简单性如何成就强大性(二)
cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权⾼的进程有优先执⾏权利。配置进程优先权对多任务环境的linux很有⽤,可以改善系统性能。还可以把进程运⾏到指定的CPU上,这样⼀来,把不重要的进程安排到某个CPU,可以⼤改善系统整体性能。
2025-03-03 14:10:04
782
原创 Linux的进程观:简单性如何成就强大性(一)
为了弄明⽩正在运⾏的进程是什么意思,我们需要知道进程的不同状态。⼀个进程可以有⼏个状态(在Linux内核⾥,进程有时候也叫做任务)。t追踪暂停状态(tracing stopped):在调试的过程之中程序遇到断点后停止的状态。Z僵尸状态(zombie):进程结束后到被父进程获取到结束信息并回收这段时间。R运⾏状态(running): 并不意味着进程⼀定在运⾏中,它表明进程要么是在运⾏中要么在运⾏队列⾥。
2025-03-03 13:10:10
965
原创 Linux中的cgdb的基本使用
Linux中的cgdb是一个基于GDB(GNU Debugger)的图形化调试前端,它结合了GDB的命令行界面功能和代码查看窗口,为开发者提供了一个更为直观的调试体验。
2025-02-25 20:22:18
680
原创 Linux与Git:代码管理的艺术
不知道你⼯作或学习时,有没有遇到这样的情况:我们在编写各种⽂档时,为了防⽌⽂档丢失,更改失误,失误后能恢复到原来的版本,不得不复制出⼀个甚至多个副本。但在此之前的⼯作都需要这些不同版本的报告,于是每次都是复制粘贴副本,产出的⽂件就越来越多,⽂件多不是问题,问题是:随着版本数量的不断增多,你还记得这些版本各⾃都是修改了什么吗?⽂档如此,我们写的项⽬代码,也是存在这个问题的。为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。
2025-02-17 17:51:50
1016
原创 Linux项目构建秘籍:揭秘make与Makefile的奥秘
会不会写makefile,从⼀个侧⾯说明了⼀个⼈是否具备完成⼤型⼯程的能⼒。⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀系列的规则来指定,哪些⽂件需要先编译,哪些⽂件需要后编译,哪些⽂件需要重新编译,甚⾄于进⾏更复杂的功能操作makefile带来的好处就是⸺“⾃动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全⾃动编译,极⼤的提⾼了软件开发的效率。
2025-02-17 16:59:52
796
原创 Linux Vim编辑器:快捷键与高效编辑技巧
vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,⽽且还有⼀些新的特性在⾥⾯。例如语法加亮,可视化操作不仅可以在终端运⾏,也可以运⾏于x window、 mac os、 windows。在此博客中,统⼀按照vim来进⾏讲解。
2025-01-31 15:54:22
1009
原创 Linux的基本指令(下)
Linux下find命令在⽬录结构中搜索⽂件,并执⾏指定的操作。Linux下find命令提供了相当多的查找条件,功能很强⼤。由于find具有强⼤的功能,所以它的选项也很多,其中⼤部分选项都值得我们花时间来了解⼀下。即使系统中含有⽹络⽂件系统( NFS),find命令在该⽂件系统中同样有效,只你具有相应的权限。在运⾏⼀个⾮常消耗资源的find命令时,很多⼈都倾向于把它放在后台执⾏,因为遍历⼀个⼤的⽂件系统可能会花费很⻓的时间(这⾥是指30G字节以上的⽂件系统。
2025-01-27 15:30:38
637
原创 Linux的基本指令(上)
对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信息。-a 列出⽬录下的所有⽂件,包括以 . 开头的隐含⽂件。-d 将⽬录像⽂件⼀样显⽰,⽽不是显⽰其下的⽂件。如:ls ‒d 指定⽬录。-i 输出⽂件的 i 节点的索引信息。如 ls ‒ai 指定⽂件。-k 以 k 字节的形式表⽰⽂件的⼤⼩。ls ‒alk 指定⽂件。-l 列出⽂件的详细信息。n ⽤数字的 UID,GID 代替名称。-r 对⽬录反向排序。-t 以时间排序。-s 在l⽂件名后输出该⽂件的⼤⼩。
2025-01-24 23:20:57
1691
原创 C++智能指针:高效管理内存的艺术
下⾯程序中我们可以看到,new了以后,我们也delete了,但是因为抛异常导,后⾯的delete没有得到执⾏,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后delete内存,再把异常抛出,但是因为new本⾝也可能抛异常,连续的两个new和下⾯的Divide都可能会抛异常,让我们处理起来很⿇烦。智能指针放到这样的场景⾥⾯就让问题简单多了。
2025-01-13 20:43:55
836
原创 C++异常机制:构建健壮代码的艺术
异常处理机制允许程序中独⽴开发的部分能够在运⾏时就出现的问题进⾏通信并做出相应的处理,异常使得我们能够将问题的检测与解决问题的过程分开,程序的⼀部分负责检测问题的出现,然后解决问题的任务传递给程序的另⼀部分,检测环节⽆须知道问题的处理模块的所有细节。C语⾔主要通过错误码的形式处理错误,错误码本质就是对错误信息进⾏分类编号,拿到错误码以还要去查询错误信息,⽐较⿇烦。异常时抛出⼀个对象,这个对象可以函数更全⾯的各种信息。
2025-01-11 16:39:45
999
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅