- 博客(55)
- 收藏
- 关注
原创 Qt SingleApplication实现分享
QSingleApplication是一个用于确保应用程序单实例运行的类,这在防止多个应用实例运行时非常有用。该类基于 Qt 框架进行开发,并继承自QApplication,使其可以完全替代常规的 Qt 应用程序类使用。
2024-09-05 12:48:18
589
原创 新特性之C++17
临时物质化是指在需要一个完整的对象时,将一个临时的prvalue(纯右值)表达式转换为一个临时对象的过程。当 prvalue 需要作为引用的初始化值时: 如果一个 prvalue 被用作初始化一个引用,那么这个 prvalue 将会物质化为一个临时对象,以便引用可以绑定到它上面。在 prvalue 作为函数参数传递时: 如果函数参数是按值传递的,而传递的实参是 prvalue,那么这个 prvalue 将物质化为一个临时对象,然后将其传递给函数。在 prvalue 作为函数的返回值时。
2024-07-04 16:36:33
2938
原创 新特性之C++14
C++14 旨在修复 C++11 的一些缺陷,并提供了一些重要的增强功能,以简化开发者的日常编码工作。主要的新特性包括泛型 lambda、返回类型推导、二进制字面量以及标准库的一些改进。C++14 通过引入和优化多项新特性,使得编程更加简洁、高效。它不仅改进了 C++11 的不足之处,还为开发者提供了更强大的工具,以编写更安全、性能更高的代码。无论是在泛型编程、编译期计算,还是在日常编码中,C++14 都展示了其巨大的价值。
2024-07-03 17:27:14
625
原创 深入理解Qt的隐式共享机制
隐式共享是一种内存管理策略,它允许多个对象共享相同的数据副本,直到某个对象需要修改这些数据时才进行实际的数据复制。减少内存使用:多个对象可以共享同一个数据副本,而不是每个对象都持有一个数据副本。提高性能:减少数据复制的需要,从而降低程序的总体资源消耗。代码简化:开发者不需要关心数据如何被共享或复制,所有这些都由Qt框架自动管理。
2024-07-02 17:25:45
1003
原创 深入理解TCP协议格式(WireShark分析)
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它的设计目的是为了提供一个可靠的端到端的数据传输服务,在不可靠的互联网环境中保证数据正确传输。
2024-07-01 03:00:00
3222
2
原创 QtPropertyBrowser属性栏(附测试程序代码)
和QtProperty。是负责管理特定类型属性的值和行为的抽象基类。对于每种数据类型(如整数、浮点数、颜色等),都有一个相应的实现,这些实现继承自。每个负责存储具体属性的值,处理值的变更,并发出相应的信号。是一个抽象类,负责为QtProperty生成相应的编辑器控件。每种 PropertyManager都可以有一个对应的PropertyFactory实现,这个工厂基于管理的属性类型来创建适当的编辑器控件。是一个容器控件,用于显示和编辑通过管理的属性。它使用来为每个属性创建相应的编辑器控件。
2024-06-26 14:51:13
3207
2
原创 深入理解Qt属性系统[Q_PROPERTY]
属性系统说到底就是建立在类的成员变量之上,并通过标准化的接口(getter和setter)以及元对象系统来增强这些成员的功能。一致性和易用性提供一个统一的方法来访问和修改对象的属性,这意味着无论你在哪里或如何使用这些对象,访问和修改属性的方式总是相同的。这种一致性减少了学习和使用不同对象时的认知负担,使得开发更直观,同时也减少了代码中可能出现的错误。封装和数据保护通过标准化的 getter 和 setter 方法来访问和修改数据,这增强了封装性,保护了数据不被非法访问和修改。
2024-06-24 17:25:15
2525
原创 深入理解和实现Windows进程间通信(共享内存)
Windows共享内存(Shared Memory in Windows)是一种操作系统机制,允许不同的进程(程序)共享一段内存空间。这意味着多个进程可以同时访问同一个内存区域,用以交换数据或进行通信,这是进程间通信(IPC)的一种形式。使用共享内存通常可以提高应用程序之间的数据交换效率,因为它避免了数据的复制过程,直接在内存中进行读写。基于实际的磁盘文件或系统分页文件来创建内存映射文件对象。
2024-06-21 10:56:54
5120
原创 深入理解和实现Windows进程间通信(信号量)
信号量(Semaphore)是一个非常重要的同步机制,用于控制多个线程或进程对共享资源的访问。其基本思想是使用一个整数变量来表示可用资源的数量,通过对这个整数的操作来控制资源的分配,从而实现对竞态条件的管理。信号量的操作是原子的,即在一个操作进行的过程中,不会被其他进程或线程中断。功能:创建或打开一个命名或无名的信号量对象。声明参数lpSemaphoreAttributes:指向一个结构,该结构决定返回的句柄是否可以被子进程继承。如果为NULL,则句柄不可继承。
2024-06-21 09:44:17
2659
原创 深入理解和实现Windows进程间通信(消息队列)
Windows操作系统使用消息机制来促进应用程序与操作系统之间的通信。每当发生事件(如键盘按键、鼠标移动或系统事件)时,操作系统都会生成相应的消息。这些消息被发送到一个特定的消息队列中,随后由应用程序的消息循环处理。GetMessage这四个接口是Windows消息处理的核心,它们各自承担着不同的角色和功能。
2024-06-20 16:57:18
3258
1
原创 深入理解和实现Windows进程间通信(管道)
管道是共享内存的一部分,用于促进进程之间的通信。Windows支持两种类型的管道:匿名管道和命名管道。这两种管道虽然在使用场景和功能上有所区别,但底层实现原理都是基于操作系统的内核管理,涉及内存管理、数据同步和进程间安全通信。
2024-06-20 11:22:34
3278
原创 深入理解Qt状态机的应用(二)
前文《深入理解Qt状态机的应用(一)》介绍了状态机的理论知识以及简单的状态机示例。在实际应用场景中,状态机往往会比较复杂;本文将详细介绍分组状态、历史状态、并行状态以及其他技术。
2024-06-19 17:28:01
1710
原创 深入理解Qt状态机的应用(一)
有限状态机(finite-state machine)又称有限状态自动机(finite-state automaton),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。这个概念在计算机科学、数学、语言学、工程以及其他研究领域都有广泛的应用。有限状态机非常适合用于描述那些通过一系列的输入来转移状态的系统。
2024-06-18 16:44:23
1110
1
原创 QtWidgets样式表教程(附代码)
Qt Widgets的样式表(Style Sheet)类似于Web开发中的CSS,可以用于控制Qt应用程序中控件的外观。通过样式表,开发者可以统一管理控件的样式,简化代码,提升开发效率。
2024-06-17 16:53:01
2854
1
原创 Qt Widget Z-Order理解
QWidget的视觉Z-Order可以通过stackUnder、lower、raise三个函数来修改初始化的Z-Order和添加child Widget的先后有关。
2024-06-16 04:00:00
661
原创 Qt qInstallMessageHandler(自定义消息处理)
break;break;break;break;break;// 安装消息处理程序// 打印信息输出:从上面示例看出我们可以去规范输出的格式,那么我们能不能决定输出的地方呢?比如直接输出到文件中?break;break;break;break;break;// 输出字符串格式化// 读写文件// 安装消息处理程序// 打印信息输出:注意:文件每次调用都要open和close。
2024-06-15 04:00:00
494
原创 深入理解Qt多线程编程(QtConcurrent)
QtConcurrent模块提供了一组便捷的函数,用于在不显式创建和管理线程的情况下实现并发编程。它通过将任务提交给线程池来执行,从而避免了频繁创建和销毁线程带来的性能开销。QtConcurrent非常适合处理需要并行执行的批量任务,并且能够自动管理线程和任务的分配。实现原理:创建一个QRunnable子类对象,重载run(),在run()函数内调用线程函数,并将结果通过记录下来。所有Runnable都是通过来执行,可以用全局的线程池对象,也可以自定义线程池对象。
2024-06-14 14:37:09
6713
原创 深入理解Qt多线程编程(QThreadPool)
QThreadPool是Qt提供的一个线程池实现,用于管理和复用线程。线程池通过复用现有的线程来避免频繁创建和销毁线程带来的性能开销,适用于需要频繁执行并发任务的场景。QThreadPool内部维护了一个线程队列,可以在程序运行时动态分配和管理线程资源。返回当前活动(正在运行任务)线程的数量。这个数字不包括闲置等待工作的线程。清除线程池的任务队列。已经开始的任务将会继续完成,但队列中等待开始的任务会被取消。检查指定的线程是否属于该线程池。
2024-06-12 18:33:26
3859
原创 深入理解Qt多线程编程(QThread)
启动线程,并根据给定的Priority调整线程的优先级。立即终止线程。使用这个方法非常危险,因为它不保证线程的资源正常释放。不推荐使用。退出线程的事件循环。通常用于让exec()函数返回。使线程的事件循环退出,可以指定退出码returncode。阻塞当前线程直到这个QThread对象结束。可以指定超时时间time,如果线程在指定时间内结束则返回true,否则返回false。QThread底层是通过不同平台提供的线程创建接口来创建线程,并且在线程创建后默认开启事件循环,使信号槽能够跨线程通信。
2024-06-11 15:02:49
2301
原创 快速入门和学习Qt 6.3的技巧
学习Qt 6.3需要一定的时间和耐心,但通过系统的学习方法和丰富的实践,可以迅速上手并开发出功能强大的应用。记住,多利用官方资源,积极参与社区交流,是提高学习效率的有效途径。希望本文的介绍能为你的Qt学习之旅提供有益的帮助。
2024-06-08 04:00:00
730
原创 深入理解C++三五零法则
三五零法则就是三法则(The Rule of Three)、五法则(The Rule of Five)、零法则(The Rule of Zero)。三五零法则是和C++的特殊成员函数有关,特别是那些涉及对象如何被创建、复制、移动和销毁的函数。这些法则提供了指导原则,帮助开发者设计和实现那些管理资源(如动态内存、文件句柄等)的类。
2024-06-07 04:30:00
2736
原创 深入理解C++多线程系列——线程基础
算数逻辑单元(ALU)ALU是CPU的计算核心,负责执行所有的算数运算(如加减乘除)和逻辑运算(如比较大小、与、或、非等)。ALU根据控制单元发来的指令进行相应的数据处理。控制单元(CU)控制单元负责从内存中取出指令,解析并执行它们。它控制CPU内部和CPU与其他计算机组件之间的数据流动,确保各个部件协调一致。寄存器寄存器是CPU内部非常小但速度极快的存储设备。它们用于暂存指令、数据和地址等信息。寄存器的使用极大地提高了CPU的处理速度和效率。缓存。
2024-06-05 14:28:17
1092
原创 快速入门C++正则表达式
特殊字符在正则表达式中的作用是非常重要的,可以定义一系列的匹配规则。描述匹配除换行符(\n)外的任意单个字符。如果要匹配字符,请用\.。[.]内的匹配的是而不是任意单个字符(.)内的匹配的是任意单个字符,而不是示例a.c匹配的是abcacc等,但无法匹配ac[a.c]匹配的是ac,但无法匹配abc描述匹配前面子表达式任意多次(包含0次)。如果要匹配字符,请用\*。子表达式的意思是可以单独拎出来作为正则表达式的字符串在匹配时必须保证的前面有子表达式[*]内的匹配的是字符示例ab*c。
2024-06-04 16:56:28
1421
2
原创 Qt基于信号槽的发布订阅机制(附代码)
信号槽机制是Qt的核心。在实际使用过程中,有些场景会导致connect操作和emit操作中的代码特别繁琐,需要一层一层去找。后面我根据信号槽底层实现的接口设计了一套发布订阅机制。
2024-06-01 05:00:00
877
原创 【C++奇技淫巧】CRTP(奇特重现模板模式)
使用虚函数有性能问题,需要优化,可以将虚函数转成CRTP(后续文章会介绍)能够抽象出通用方法,派生类只使用方法,不重写/修改方法需要基于现有的通用方法来添加新功能(不改变通用方法)其实在使用CRTP和虚函数的核心区别是,CRTP的继承关系中能够抽象出通用方法,且不会修改通用方法;而虚函数是抽象出通用方法,但要重写方法,只是把通用方法当做一个入口。
2024-05-31 16:09:24
1895
1
原创 深入探索Qt框架系列之信号槽原理(三)
前面两篇分别介绍了和,那么信号槽机制的基础已经介绍完了,本文将介绍信号槽机制是如何从信号到槽的,以及多线程下是如何工作的。
2024-05-31 05:00:00
1082
原创 深入探索Qt框架系列之信号槽原理(二)
通过连接后,新建一个Connection对象,该对象中维护了发送者、接收者、信号索引、槽函数索引、接收者所在线程的信息、连接类型等。然后把Connection对象存储到发送者对象的链表中。下一篇将完整的介绍信号发送到槽函数执行的整个流程。
2024-05-30 11:23:52
589
原创 深入探索Qt框架系列之三大编译器
通过MOC、UIC和RCC这三个强大的工具,Qt不仅增强了C++的功能,还简化了用户界面设计和资源管理。这三者的合作为Qt应用程序的开发提供了无与伦比的便利和效率,是Qt框架区别于其他框架的关键特点。理解这些工具的工作原理不仅可以帮助开发者更好地利用Qt框架的强大功能,还能促进写出更高效、更可维护的代码。
2024-05-29 04:15:00
1558
原创 深入理解C++智能指针系列(六)
所以,出现这个错误的原因就是因为pimpl的特性是在类中使用不完全定义的类型,当由编译器生成默认析构函数时会导致头文件中delete一个不完全定义的类型对象。所以,我们必须显式定义Shapepublic:Shape();// 构造函数~Shape();// 析构函数需要显式定义// 示例公共方法private:// 前置声明内部实现类// 指向实现的智能指针public:// 实现细节,例如绘制图形// Shape 成员函数实现。
2024-05-28 10:09:12
345
原创 深入理解C++智能指针系列(四)
在上一篇介绍了的删除器,其实,在大多数时候,我们使用时,不需要使用自定义删除器。本文主要介绍一种方法来优化上面的代码。
2024-05-28 05:30:00
530
基于Qt开发的截屏软件(已发布)
2025-01-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人