自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 多线程中,什么是condition_variable?

摘要:condition_variable是用于线程同步的工具,让线程在条件不满足时休眠,条件满足时被唤醒。它不保护数据,只管理线程的等待/唤醒机制。使用时必须配合mutex和条件判断,核心操作包括wait、notify_one和notify_all。关键要点:1) 必须使用while循环或predicate检查条件,防止虚假唤醒;2) 条件状态由程序员维护;3) notify只是提醒检查条件,不保证条件成立。典型用法示例展示了如何正确实现线程间的条件等待和通知机制。

2025-12-20 22:26:56 397

原创 为什么线程阻塞要用.join而不是.wait

文章摘要:join()方法源自Fork-Join并发模型,其核心是执行流的"合并"而非单纯"等待"。主线程调用join()表示要与子线程重新合并为一条执行流,等待是合并的自然结果。与wait()不同,join()专门用于线程终结时的资源回收,语义更明确。该术语源于1963年Melvin Conway提出的并行计算概念,detach()代表永久分离,而join()体现最终汇合。这种设计准确反映了线程生命周期的合并逻辑。

2025-12-20 21:08:13 141

原创 Qt开发之 VS 与 QtCreator二三事

本文对比了Visual Studio(VS)与Qt Creator在Qt开发中的表现。

2025-11-18 20:27:59 1029

原创 【SQL】超详细 | 图文并茂 | 带你了解数据库存储过程与视图

存储过程与视图

2025-10-28 09:56:18 896

原创 前端与移动开发之 CSS vs QSS

摘要: CSS(层叠样式表)用于网页设计,通过选择器控制HTML元素的外观(颜色、字体、布局等),支持层叠与动画效果。QSS(Qt样式表)语法类似CSS,但专用于Qt控件美化,可调整按钮、文本框等组件的颜色、边框和交互状态,通过.qss文件或代码直接应用。两者均支持伪类(如悬停效果),但CSS作用于网页,QSS仅影响Qt应用程序界面。示例展示了如何用CSS和QSS分别实现绿色按钮的悬停变色效果,体现语法相似性及应用场景差异。

2025-10-27 23:46:44 465

原创 为什么 QStringLiteral 比普通字符串写法更高效 | QString 在 Qt 内部的构造机制与内存优化

本文对比了Qt中两种字符串创建方式的区别:普通QString构造和QStringLiteral宏。普通写法会在运行时执行编码转换、堆内存分配和数据拷贝,而QStringLiteral在编译时将字符串转为UTF-16常量存储在只读段,避免了运行时开销。性能测试显示后者在循环等场景下显著降低CPU和内存消耗。Qt官方推荐对固定文本使用QStringLiteral以获得最佳性能,特别适合嵌入式或高频调用场景。

2025-10-27 22:20:51 525

原创 什么是前端、后端与全栈开发,Qt属于什么?

本文介绍了软件开发的三个主要方向:前端、后端和全栈。前端负责用户界面展示和交互,使用HTML/CSS/JavaScript等技术实现设计稿;后端处理业务逻辑、数据管理和接口提供,常用Python/Java等语言;全栈开发者则兼具前后端能力。文章还特别说明了Qt框架既可以用于前端界面开发,也能通过数据库模块实现后端功能。三者各司其职又相互配合,共同构成完整的应用系统。

2025-10-19 16:11:41 536

原创 [Qt] 什么是qmake与cmake

CMake是一个跨平台的构建系统工具,用于生成不同平台的本地构建文件(如Makefile、VS工程等),但不直接编译代码。qmake是Qt专用的构建工具,自动处理Qt特有的编译步骤。CMake适用范围更广,扩展性强,已成为现代C++项目的主流选择,Qt6也推荐使用CMake。两者与编译器的关系是:CMake/qmake生成构建规则,make执行编译,编译器完成实际编译工作。Qt Creator可自动生成qmake工程文件,而CMake需手动配置CMakeLists.txt。一个简单的Qt CMake项目需指

2025-10-17 19:53:55 1079

原创 【github扫盲】Dashboard、Repositories、Issues、Pull Requests

GitHub常见功能及术语中英对照表 GitHub常用功能与中文博客概念对应关系

2025-10-12 18:28:19 799

原创 【github扫盲】MIT License是什么?

说人话就是:“你可以随意用、改、卖我的代码,只要别删我的名字;> 出了问题别来找我负责”

2025-10-12 17:56:20 782

原创 什么是 Qt 的元对象系统?

Qt的元对象系统是其核心特性之一,在标准C++基础上扩展了运行时反射能力。通过Q_OBJECT宏和moc工具,系统会为类生成元数据(QMetaObject),包含类名、属性、信号槽等信息。运行时可通过metaObject()访问这些数据,支持动态属性查询、类信息获取等功能。元对象系统还实现了信号槽机制的基础,支持跨线程通信。此外,系统允许动态添加未声明的属性。这一机制使Qt在保持C++性能的同时,获得了类似动态语言的灵活性。

2025-10-12 17:43:58 343

原创 Qt有哪些信号槽可以在 Designer 中直接连接,哪些必须通过代码实现?附完整代码

本文介绍了在Qt开发中通过信号与槽机制实现控件交互的方法。以QCheckBox控制QPlainTextEdit字体加粗为例,分析了Qt Designer的局限性:只能连接控件已有的标准槽函数,无法直接实现自定义功能。文章详细展示了通过代码实现的步骤:1)声明自定义槽函数;2)实现字体设置逻辑;3)手动连接信号与槽。提供了完整的代码示例,包括界面初始化、信号槽连接和具体功能实现(字体加粗、斜体、颜色设置等)。该案例演示了当Designer无法满足需求时,如何通过代码实现更复杂的控件交互功能。

2025-10-11 21:08:28 757

原创 Qt中的字符串宏 | 编译期检查和运行期检查 | Qt信号与槽connect写法

文章摘要:字符串宏是C/C++中通过预处理器进行文本替换的机制,字符串宏展开后生成字符串字面量。Qt早期版本使用SIGNAL()/SLOT()宏实现信号槽连接,这种基于字符串匹配的方式存在运行时才能发现错误的弊端。Qt5+推荐使用函数指针的新式connect语法,通过编译期检查确保信号槽的正确性。编译期检查在编译阶段发现问题,比运行期检查更安全高效,能避免拼写错误和类型不匹配等问题。新式语法利用了C++的类型系统,在编译时就能验证信号和槽的存在及匹配性。

2025-10-11 18:33:37 1262

原创 为什么Qt中的字符串类型为QString而不采用std::string?

QString 是 Qt 自己定义的字符串类,用来代替标准库中的 std::string,它位于 <QString> 头文件中。

2025-10-11 18:14:43 172

原创 Qt 为什么控件要用指针创建?

Qt控件使用指针主要有三个原因:1.便于父子对象管理内存,父对象析构时会自动删除子控件;2.支持动态创建和布局管理,普通对象在构造函数结束后会被销毁;3.确保成员函数能持续访问控件状态。指针形式能保持控件生命周期与程序运行周期一致,避免内存泄漏和悬空指针问题。

2025-10-10 19:59:22 359

原创 Linux 基本命令超详细解释第四期 | vi | su | exit | sudo

su是的缩写,用于在终端中切换用户身份。最常见的用途是切换到root 用户,以执行系统管理任务exit用于退出当前 shell 环境或终止用户登录,当你使用su或远程登录后,可以用它返回上一级会话sudo(superuser do)允许普通用户以root 权限执行命令,它比su更安全,因为:只在当前命令中临时获得权限;不需要知道 root 密码;所有操作都有日志记录。

2025-10-10 19:52:43 471

原创 Linux 基本命令超详细解释第三期 grep | wc | 管道符‘|’ | echo | tail | 重定向符

加上。

2025-09-26 21:03:21 1018

原创 Linux 终端常用快捷键整理

本文汇总了Linux命令行常用快捷键,分为五类功能:光标移动(如Ctrl+A行首、Ctrl+E行尾)、文本编辑(如Ctrl+U删前行、Ctrl+K删后行)、历史命令(Ctrl+R反向搜索、!!重执上条)、控制操作(Ctrl+C终止、Ctrl+L清屏)和其他功能(Tab补全、Alt+U转大写)。这些快捷键可显著提升终端操作效率,覆盖命令输入、修改、检索等常见场景。

2025-09-19 23:01:29 1320

原创 Linux 基本命令超详细解释第二期 | touch | cat | more | cp | mv | rm | which | find

文件扩展名在 Linux 里并不是强制要求,Linux 判断文件类型主要看内容(比如用。find 用于 在目录下查找文件或目录,可按名字、类型、时间、大小等条件搜索。用于查看文件内容、合并文件,或通过重定向创建文件。如果文件名是简单的字母、数字,没有空格或特殊字符,指定的目录里寻找这个可执行文件,然后运行它。创建文件并输入内容(Ctrl+D 结束输入)用于创建空文件,或修改文件的时间戳。👉 不提示、递归删除目录,非常危险。,用于移动或重命名文件/目录。的文件(支持通配符,比如。合并多个文件,并写入新文件。

2025-09-19 22:55:42 1059

原创 linux中为什么 rm 命令能删除自己 | linux使用rm命令删自己会怎样?

文章探讨了在Linux系统中用rm命令删除自身时会发生什么。rm作为/bin/rm的可执行文件,运行时会被加载到内存形成独立进程。删除磁盘上的rm文件不会影响已在运行的进程,但后续新终端将因找不到该命令而报错。这展示了Linux程序执行与磁盘文件的分离特性:程序加载到内存后就拥有独立副本,原文件删除不影响已运行进程。

2025-09-19 22:32:40 396

原创 Linux 基本命令超详细解释第一期 | cd | pwd | ls | mkdir | rmdir

本文介绍了Linux系统常用的目录操作命令: cd:切换目录,支持主目录(~)、上一目录(-)、上级目录(..)等操作 pwd:显示当前目录路径,分逻辑路径(-L)和物理路径(-P) ls:列出目录内容,常用参数-l(详情)、-a(隐藏文件)、-h(友好大小) mkdir:创建目录,支持多级创建(-p)、权限设置(-m)和过程显示(-v) rmdir:删除空目录,递归删除需加-p参数 注意事项包括: cd是shell内置命令 删除非空目录需用rm -r 目录权限用数字表示(如755) 使用符号链接时注意逻辑

2025-09-14 22:56:32 821

原创 MySQL 主键详解:作用与使用方法

MySQL主键是数据库表设计的核心元素,具有多重关键作用。作为唯一标识,主键确保每行数据不可重复且非空(如id INT PRIMARY KEY)。它维护数据完整性,防止重复记录;作为外键关联基础,实现表间关系;同时通过自动创建聚簇索引显著提升查询效率(如SELECT * FROM users WHERE id=2)。主键使用方式多样:可在建表时定义、后期添加,支持复合主键(多列组合)、自增主键(AUTO_INCREMENT)等。合理运用主键能有效优化数据库结构与查询性能。

2025-08-15 20:27:15 696

原创 为什么C++主函数 main 要写成 int 返回值 | main(int argc, char* argv[]) 这种写法是什么意思?

本文解答了C++中main函数的两个常见问题:1) main函数必须返回int类型值,这是为了向操作系统报告程序执行状态(0表示成功,非0表示错误);2) 带参数的main(int argc, char* argv[])形式通过命令行参数接收数据,这些参数由操作系统在程序启动前解析并传入,因此不需要使用cin。文章还演示了如何在不同开发环境中配置命令行参数。

2025-08-12 21:23:02 1089

原创 C++ vector 扩容时到底发生了什么?

本文深入解析C++中std::vector的扩容机制。vector通过动态分配连续内存实现自动扩容,当push_back()时若空间不足,会申请新内存(通常2倍扩容),将旧元素整体搬迁后释放原内存。这种"整体搬家"操作成本较高,特别是元素多或类型复杂时。为优化性能,建议:1)为自定义类实现noexcept移动构造函数;2)提前使用reserve()预分配空间,减少扩容次数。理解这些底层机制有助于编写高效代码。

2025-08-07 23:41:33 468

原创 C++默认构造函数 ()= default 和 (){} 有什么区别

一个类/结构体是“聚合类型”,必须满足以下所有条件(C++14):没有用户提供的构造函数(包括也算“用户提供”)所有非静态成员都是 public没有虚函数没有基类没有默认成员初始化器(C++17之前)写了就会失去聚合性但不会,它仍然符合“没有用户提供的构造函数”的条件。POD 类型 = 满足下面两个条件的类:是trivial 类型是standard-layout 类型struct A {int x;int y;// ✅ 聚合 ✅ POD(默认构造 trivial 且没有特殊行为)

2025-08-06 15:46:43 1167

原创 C++ 变量初始化方式总结 | 拷贝初始化 | 列表初始化 | 值初始化

C++初始化方式总结:拷贝初始化(int a=1)最常见但可能有隐式转换风险;直接初始化(int a(1))更高效;列表初始化(int a{10})最安全,能防止窄化转换并支持容器初始化。列表初始化优先调用initializer_list构造函数,要求类模板提供对应实现。值初始化(int a{})确保变量初始化为零值,避免未定义行为。explicit构造函数禁止隐式转换,只能使用直接或列表初始化。

2025-08-05 23:32:14 716

原创 C++ 拷贝赋值、swap 与 noexcept 深度解析:高效实现 operator=

本文介绍了C++中实现安全高效的赋值运算符的方法。通过分析传统实现方式的缺点(重复代码、性能不高),推荐采用现代"Copy-and-Swap"技巧:通过值传递参数自动处理自赋值问题,利用swap函数完成资源交换,配合noexcept优化性能。该方法不仅简化了代码,还提高了异常安全性,并能与移动构造函数协同工作。文中还对比了std::copy与for循环的优劣,并展示了包含拷贝构造、移动构造和析构函数的完整MyArray类实现,为自定义类资源管理提供了现代化解决方案。

2025-08-05 22:51:22 482

原创 C++ 中 NULL 与 nullptr 有什么区别?

C++中NULL与nullptr的根本区别在于类型和安全性。NULL本质是整数0(int类型),在重载和模板中可能被误认为整数而非指针,导致意外行为;而nullptr是C++11引入的关键字(std::nullptr_t类型),专为空指针设计,智能转换为任意指针类型。典型场景中,NULL会错误匹配int重载(foo(NULL)调用foo(int)),而nullptr能正确调用指针版本(foo(nullptr)调用foo(char*))。在模板编程时,NULL推导为int,nullptr保持指针类型。因此,现

2025-07-30 22:05:07 516 1

原创 【C++基础】为什么两个字符串字面量看起来相同,却地址不同?

摘要:文章解释了C++中字符串常量的地址比较问题。关键在于区分指针变量地址和其指向的字符串地址。当使用&str时输出的是指针变量本身的地址,而非字符串地址。正确的比较方法应使用static_cast<const void*>(str)来查看字符串的实际地址。编译器通常会对相同字符串字面量进行合并优化,使其指向同一内存地址,但这种优化并非强制要求。文章还指出重新赋值会导致指针指向不同地址,并给出了验证字符串地址是否相同的正确代码示例。

2025-07-28 18:15:52 387

原创 【C++基础】为什么 char* 输出是字符串,而 int* 输出是地址?

同样是指针,为什么int*输出的是地址,而char*输出的是字符串内容?这和 C++ 标准库中对的重载实现密切相关。本文将从语义、函数重载、底层行为等方面详细解释这个问题。

2025-07-28 18:08:23 392

原创 【简述】C++11/14/17/20/23 中的关键新特性

C++11到C++23的演进展示了现代C++的关键改进。C++11引入auto、智能指针和移动语义等特性,奠定了现代C++基础。C++14增强类型推导和Lambda表达式。C++17新增结构化绑定、编译期if等实用功能。C++20带来概念、协程、范围等重大突破。C++23则进一步优化错误处理和编译时计算。这些改进使C++从手动内存管理发展为更安全高效的语言,提供了更优雅的语法、更强的性能控制和更安全的工程实践方式,标志着现代C++时代的到来。

2025-07-26 23:20:37 475

原创 【C++基础】引用 vs 指针:一次彻底弄懂它们的区别与联系

引用和指针是C++中两种重要的间接访问机制。引用是变量的别名,必须初始化且不可更改绑定;指针存储变量地址,可修改指向。引用语法更简洁安全,不能为null或重绑定;指针更灵活但风险高,支持空值、重定向和算术运算。引用常用于函数参数传递和运算符重载,指针适用于动态内存管理和数据结构构建。建议优先使用引用传递参数,必要时使用智能指针管理动态内存,避免裸指针和悬空引用。

2025-07-26 23:11:51 481

原创 【C++基础】指针常量 | 常量指针 | int* p | const int* p | int* const p| const int* const p

C++中const修饰指针存在四种组合形式:普通指针可修改值和地址;指向常量的指针(const在左边)允许修改指向但禁止改值;常量指针(const在右边)固定指向但允许改值;指向常量的常量指针则完全不可修改。关键在于const的位置:左侧修饰值,右侧修饰指针本身。实际应用中,const指针常用于函数参数保护数据(防止意外修改)或固定资源地址(避免指向变更)。理解这些差异有助于编写更安全、可靠的代码。

2025-07-26 23:02:22 345

原创 C++ 模板详解 | 函数模板 | 类模板 | 模板编译原理 | 模板元编程

摘要:C++模板是泛型编程的核心,允许编写与类型无关的通用代码。模板分为函数模板和类模板,通过编译期展开为具体类型生成代码,实现类型安全和高效执行。模板特化(全特化/偏特化)可为特定类型定制实现,非类型模板参数支持编译期常量。STL容器和算法广泛应用模板实现泛型设计。模板元编程利用编译期计算优化性能,但可能增加编译时间。正确使用模板需注意定义位置、参数匹配规则和类型推导特性。

2025-07-24 00:30:22 1740

原创 【C++面试】拷贝构造函数为什么要用引用?如果用指针或者值传递会怎样?

拷贝构造函数必须使用引用Person(const Person& p)的原因:1. 避免无限递归(按值传递Person(Person p)会导致构造时又需要调用拷贝构造)2. 提高效率(引用避免对象复制开销)3. 传指针Person(const Person* p)不是拷贝构造函数,不会被编译器自动调用。标准拷贝构造函数通过const引用既能安全复制对象,又能防止修改原对象,是唯一合法的拷贝构造签名形式。

2025-07-22 17:56:29 290

原创 引用 (int&) 与指针 (int*) 传递孰优孰劣?| C++

C++中引用与指针的对比分析:两者都能修改函数外部的变量值,但特性不同。引用语法简洁(直接使用变量名),且不能为null,适合必须修改且参数必填的场景;指针需要解引用(*操作符),但更灵活(可设为nullptr),适合可选参数或复杂数据结构。实际开发中,图像处理等确定性操作推荐引用,而回调函数等可选场景建议用指针。两者性能相当,选择取决于语义需求而非效率。

2025-07-22 00:31:39 1122

原创 深入理解 C++ 中的指针与自增表达式:*a++、(*a)++ 和 *++a 的区别解析

本文解析指针运算中常见的三种表达式区别:1) *a++先取指针当前值后移动指针;2) (*a)++对指针指向的值自增,指针不变;3) *++a先移动指针再取值。通过示例代码演示了不同操作对指针位置和数值的影响,强调运算符优先级和执行顺序对结果的关键作用。完整示例展示了连续执行这些表达式时指针和数值的变化过程。

2025-07-22 00:07:14 677

原创 C++ 智能指针 std::shared_ptr 指南:小白也能懂!

本文介绍了C++11引入的shared_ptr智能指针,它能自动管理内存释放,避免手动delete导致的内存泄漏、野指针等问题。shared_ptr采用引用计数机制,当计数为0时自动释放资源。文章通过示例展示了shared_ptr的基本用法,并指出循环引用会导致内存泄漏的问题。最后介绍了weak_ptr作为解决方案,它是一种不增加引用计数的弱引用,可以打破循环引用。weak_ptr需要通过lock()方法获取临时shared_ptr来访问对象。智能指针的使用大大简化了C++内存管理,让开发者更专注于业务逻辑

2025-07-20 16:15:00 347

原创 C++ 多线程中成员函数如何传参?拷贝、引用还是指针?

本文探讨了C++多线程编程中调用类成员函数的正确方式。通过示例类A演示了三种传参方法:直接传对象(产生副本)、传指针或引用(操作原对象)。关键点在于成员函数调用需要this指针,因此线程中必须提供对象实例。最佳实践是传指针或引用,确保操作原对象;若类禁止拷贝,则必须使用指针或引用。静态成员函数可直接调用,不需要对象。理解this指针机制(编译器将成员函数转换为带隐藏参数的普通函数)是掌握多线程成员函数调用的核心。

2025-07-20 16:02:32 858

原创 佩奇的数学问题 | [PTA] | 求个、十、百位

摘要:本文介绍了一种特殊的数学运算符号[×],其运算方式是将整数B的每一位与整数A相乘,并将结果按位拼接。例如121[×]23=242363。实现方法是将B从低位到高位逐位分解,计算与A的乘积并转换为字符串,按顺序拼接结果。提供了C++代码实现,通过取余运算分解数字并使用字符串拼接功能完成计算。

2025-07-19 01:12:59 290

sqlserver数据库存储过程示例表

请配合博客食用:【SQL】超详细 | 图文并茂 | 带你了解数据库存储过程与视图

2025-10-28

QtUnicodeViewer

本项目是一个基于 Qt Widgets 的小型字符处理与编码演示工具。 通过界面按钮操作,可以查看字符串中每个字符的 Unicode 编码,判断字符类型(数字、字母、符号等),并演示字符编码与转换的基本操作。

2025-10-23

QtValueConverter

一个使用 Qt Widgets 编写的数值与字符串转换练习项目,展示了 QString 与基本数据类型之间的转换方法,以及 不同进制的互相转换。 适合正在学习 Qt 或 C++ 的初学者,用于理解 QString::number()、QString::setNum()、toInt() 等常用方法的使用。

2025-10-23

QtStringToolkit

QtStringToolkit 是一个基于 Qt 5/6 框架开发的字符串操作演示工具。 该项目通过图形界面直观展示了 QString 的常用函数及其效果,适合 Qt 学习者和 C++ 初学者参考。用户可以通过界面控件快速测试字符串操作,而无需手动写大量测试代码。

2025-10-23

​​Qt-Text-Style-Demo​​ - 文本样式演示

一个简单的 Qt 桌面应用程序,演示了信号与槽机制的基本使用 功能特性如下 - 字体设置:支持 Underline(下划线)、Italic(斜体)、Bold(粗体)复选框切换 - 颜色选择:提供 Black(黑色)、Red(红色)、Blue(蓝色)单选按钮选择 - 文本显示:实时预览字体样式和颜色效果 - 按钮操作:包含退出、确定、清空等基本功能按钮

2025-10-12

自用分享Qt连接mySQL多表查询工具(极值/差异/并集/交集)

Qt SQL 多表查询工具 这是一个基于 Qt 框架开发的 SQL 多表查询工具,实现了对多个学生表(`student_1`、`student_2`、`student_3`)的灵活查询功能。支持以下操作模式: 1. 极值查询:计算指定字段的最大值/最小值 2. 差异查询:查找表 A 中存在但表 B 中不存在的记录 3. 并集查询:合并多个表的全部记录(去重) 4. 交集查询:查找多个表中字段完全相同的记录 通过勾选表名、选择字段和模式,结果会以表格或文本形式展示,适合快速分析数据关系 适用人群: -Qt/C++ 初学者:学习如何连接数据库、执行复杂 SQL 及界面交互 -数据库入门者:理解多表查询(UNION、EXISTS、子查询等)的实际应用 -需要快速验证 SQL 逻辑的开发/测试人员 使用场景: -教学演示:展示 SQL 多表操作的核心概念 -小型数据比对:如对比不同版本的学生数据表差异 -功能扩展参考:可基于此项目添加更多查询模式(如分组统计、模糊查询等) 技术栈:Qt 5/6、SQLite(或其他支持 QtSQL 的数据库)、C++11

2025-07-25

空空如也

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

TA关注的人

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