自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 将 Type Code 替换为 State/Strategy 模式

将 Type Code 替换为 State 或 Strategy 模式,可以使你的代码更加灵活、可维护,并且符合面向对象设计的原则。通过将不同的行为委托给不同的类,你避免了在条件语句中重复判断类型,增加了系统的可扩展性。

2025-02-20 21:27:42 395

原创 使用多态来替换条件语句

将条件语句替换为多态,关键在于利用类和继承的机制,确保每个具体类型的行为都在它自己类的成员函数中实现。通过多态性,系统可以根据对象的实际类型动态地选择正确的行为,而无需显式地判断类型。这样可以使代码更易于扩展和维护。

2025-02-20 21:19:00 291

原创 c++模板运用踩坑记录

如果某个头文件中定义了与模板相关的符号或特性,那么编译器会根据 #include 顺序来解析这些符号,从而影响模板的实例化和跳转行为。如果某个头文件没有被包含,相关的宏可能没有被定义,从而影响调试时的跳转路径。如果某个头文件在一个编译单元中被包含而在另一个中未包含,编译器可能会为相同的模板生成不同的实例化,影响调试时的跳转路径。include头文件的顺序以及存在与否会影响同样函数调用时实际的跳转步骤,当碰到这种情况时,需要确认两个源文件中include头文件的顺序以及内容是否一致。

2025-01-21 10:55:26 204

原创 QOpenglWidget和QPainter联合使用记录

特别是深度测试会影响后续绘图,因此需要在返回到 QPainter 绘图前禁用。如果之前的 OpenGL 绘图写入了深度值,而文本的深度值未明确设置(通常为 0 或其他默认值),深度测试可能认为文本片元位于物体后面,从而丢弃文本的渲染。如果上下文已经存在,beginNativePainting() 会保存当前 QPainter 的状态,并暂时切换到原生的 OpenGL 状态。每个像素都有一个深度值(通常存储在深度缓冲区中),如果一个片元的深度值大于当前深度缓冲区的值,OpenGL 会丢弃该片元,不进行绘制。

2024-12-26 11:47:54 666

原创 cloudcompare源码编译

这里CMAKE_PREFIX_PATH这个变量写你的qt路径,CMAKE_INSTALL_PREFIX这个写你的安装路径,即刚刚创建的install。如果这里忘记了后面编译时候根据报错自己在对应git上找到对应的子仓库进行下载后拷贝到对应路径也可以。这里首先你可以新建一个文件夹,可以叫build,再新建一个文件夹,可以叫install。如果有报错看看是不是缺了子仓库,缺了的话自己找对应的仓库下载后放到对应文件夹。拉取完之后可以在目录里发现BUILD.md文件,打开可以看到需要下载qt。

2024-10-31 14:51:03 390

原创 cmake项目中添加rcc文件后registerResource失败

方法注册生成的rcc文件后,同样通过“:/xx/res.xml”的路径找到对应的资源文件。而你想用这个cpp文件,可以把这个不带–binary生成的.cpp文件加入到add_executable()中(注意,后缀名得是.cpp,改成.rcc还是会被忽略),就如之前最开始说到的嵌入到exe中的方法一样,你将他添加到add_executable中。不带–binary生成的,其实就是一个.cpp文件,但是如果你设置了out路径为rcc,他也会是rcc的后缀,但是就和上面说的一样,只是批一个rcc的皮。

2024-10-29 17:00:59 605

原创 git删除远端分支

确认:在删除之前,确保该分支不再被需要,因为删除后无法直接恢复。将 <branch_name> 替换为你想删除的分支名称。权限:确保你有权限删除远程分支。这将列出所有的远程分支。

2024-10-15 09:17:31 219

原创 VScode 使用PlantUML画类图

有时候在写开发方案的时候,需要向读者介绍自己设计的类会有哪些关键函数以及成员,同时和其他类是怎么交互,类与类之间的关系是怎么样的,那么类图就能很好地表示这些关系,所以现在记录一下如何使用VScode工具中的PlantUML扩展去进行绘制。

2024-09-06 15:30:04 1220

原创 GitLab merge request 解决冲突

你需要手动编辑这些文件,解决冲突。冲突的部分通常会被标记为。重新提交Merge Request请求,确保新的Merge Request反映了最新的更改(多一条解决冲突的提交)。场景:push本地改动到feature分支,现提出merge request到master分支,存在冲突。(如果有安装git小乌龟软件,可以右键解决冲突,更加直观,解决完标记为已解决则不需要下面操作)确保你的本地仓库是最新的,这样你可以获取到最新的master分支的代码。

2024-08-22 17:18:35 997

原创 git 错误 Could not open a connection to your authentication agent.

在使用 Windows 环境下的 Git 时,如果遇到错误 “Could not open a connection to your authentication agent.”,这通常意味着 SSH 代理(ssh-agent)没有正确运行或配置。检查 SSH 配置:编辑 ~/.ssh/config 文件以验证或修改 SSH 配置,确保 SSH 客户端知道如何使用正确的密钥与远程服务器通信。这样,每次打开新的 shell 会话时,SSH 代理将自动启动,并且密钥将自动添加到代理中。

2024-08-19 16:34:00 877

原创 UML用例图

第一个是参与者,这里可以理解成对象,这里举一个例子,比如一个设置快捷键的需求,那么参与者可以有用户(用户可以设置快捷键)、开发人员(比如你的需求是设置一个快捷键机制,开发人员可以基于此二次开发或者新增自己的快捷键设置)、管理者(可以理解成最终实现整套快捷键机制的对象);图来自这里,这篇文章写的很好,每次看到类似的好文都会想着,wc,别人都写这么好了,我还写个毛线啊,直接看别人的不就行了,后来想想,算了,敲字也是熟悉的过程,把别人的理解成我的,这也是一种学(xie)习(du)。也可以看看他人写的几种问题。

2024-08-12 20:08:28 562

原创 Qt 多线程简单使用

‌UI操作通常不是线程安全的,‌如果在非主线程中进行UI操作,‌可能会导致各种不可预测的问题,‌如应用崩溃或界面显示异常。‌例如,‌如果两个线程同时尝试修改同一个UI元素,‌可能会导致数据不同步,‌从而引发崩溃或显示错误。‌:‌主线程通常与Runloop关联,‌Runloop负责处理大部分事件,‌如用户交互等,‌确保事件能够及时响应。‌在主线程进行UI操作可以优化性能,‌确保用户界面能够快速响应并流畅更新。:‌大多数操作系统和框架设计时都遵循这一原则,‌即界面更新和用户交互应该在主线程中进行。

2024-08-11 20:23:24 300

原创 函数尾部添加const的作用

在这个例子中,nonConstFunction 可以修改 MyClass 对象的成员变量,而 constFunction 不能修改任何成员变量,它只能访问那些在类声明中被标记为 mutable 的成员变量,或者调用其他标记为 const 的成员函数。换句话说,这个函数不会改变对象的任何成员变量的值,也不会调用任何非 const 的成员函数。在Qt中,许多Qt类的成员函数都被声明为 const,因为它们设计为只读取对象的状态,而不修改它。这允许你在不修改对象的情况下,读取对象的状态。

2024-08-08 20:44:34 285

原创 QDomDocument使用经验

在有的项目中,有一些启动加载的配置是用xml格式的文件设置的,对于该类文件的读取可以用到QDomDocument这个类,同理有一些想要保留到本地的,方便下一次读取继续使用的配置也可以用该类生成并修改;下面是一段使用QDomDocument生成一个xml文件的代码。一个基础的生成和读取就差不多完成了,后续有新内容再记录。对于读取一个xml,也可以用该类。这里记录一下使用经验。

2024-08-08 15:57:55 200

原创 Qt源码编译和调试

因为有时候qt版本很老,目前已知的一些镜像或者相关网站下载不到qt的pdb文件,导致无法在调试中断点到qt源码中,这时候可以考虑编译qt源码,这里记录一下相关操作。

2024-08-07 11:45:23 1661

原创 MD与MT的区别

场景:当用户不需要静态链接运行时库的时候,然后所有的模块都采用-MD的时候,使用的是同一个堆,(看其他文章,如果是-MT的情况下,一个dll内部会有一个堆(_crtheap全局变量,_heap_init就会在每个模块里都被调用一次),如果是-MD情况下,整个进程只有一个堆(整个进程里只有运行时库里才有一份_crtheap全局变量,在crt的dll加载的时候调用一次_heap_init)多个堆存在着释放崩溃的危险,a堆申请需要a堆释放)不同的运行时库可能有不同的内存管理机制。MT/MTd(静态链接)

2024-08-06 09:55:29 696

原创 从项目开始学习CMake(3)

这个变量在整个构建过程中保持不变。第四行的输出结果in=1,这里的1同样是输入的test(1)的入参,这里可以发现第三行的set仿佛没有生效,但是其实不是,因为macro的机制导致在内部的变量需要用上$ {}去包含住才表示为入参,而这里的set的in算是一个全局变量,因此在最后一行的输出是in=2,虽然有点绕,但是这里的${in}中的in是之前set中的全局变量,不等于原来的入参(笑),原来的入参因为作用域问题已经结束了。第二行的输出结果in=1,这里的1是输入的test(1)的入参。

2024-08-02 19:46:56 374

原创 从项目开始学习CMake(2)

另外针对target_link_directories与link_directories的区别在于link_directories不用在add_library与add_execute后使用(合理,因为没有制定target),但是因此它会对后续的项目都产生影响,通俗理解就是如果你该目录下还有子目录,那么在add_subdirectory后的项目中也会有效果,因此一般建议使用target_link,这样方便控制影响。其中的SHARED表示这个文件为动态库,如果需要生成静态库文件,需要修改成STATIC,

2024-08-02 16:08:24 713

原创 cmake --preset使用 CMakePresets

cacheVariables中可以定义一些CMakelists.txt中的变量,可以理解成在cmake命令行加入-DQt5_ROOT=XXX(说明Qt5_ROOT变量的内容),也可以理解成cmakelists.txt中set命令;condition中则是判断指定版本或者更好版本的预设文件是否启用该预设,比如上述中的内容,type:equals则表示条件是比较两个字符串查看是否相等,lhs则是比较的第一个字符串,rhs则是第二字符串;strategy中是set表示用来设置,value则表示对应的值。

2024-08-02 11:58:17 2041

原创 基于vs2022生成老版本的项目的cmake命令

该命令使用vs2022的cmd窗口生成2017项目。

2024-08-01 14:12:46 402

原创 从项目开始学习CMake(1)

cmake一般可以很好的用来进行c++项目构建与编译,通过编写对应的cmakelists.txt文件,可以设置一些项目的属性以及一些依赖库,对应的源文件和头文件等,而且支持if,所以可以对平台或者一些其他选项做隔离处理。接下来是include命令,这个命令可以按下方这样使用,这样的话可以把相关的一些配置区分开来,而不是一股脑的堆在一个文件,不方便阅读和维护,像如下这样操作,就可以在不同的.cmake文件中设置不同的内容。接下来是set命令,比如你可以设置一些变量的值或者内容。

2024-08-01 11:07:19 618

原创 基于CMake\VS2022\QT下的windows c++项目开发环境

一般来说勾选上面就够了,语言包可以多加一个英文,前期可先安装,后续如果优特殊需要,例如一些特定的sdk版本或者出++生成工具等可通过后续安装好的vs2022中“工具(T)”–“获取工具与功能(T)”打开之前对应的安装界面选择特定的组件进行增项安装。大致就差不多了,后续碰到坑了再来记录,之前其实遇到了挺多qt的坑,不管是安装还是代码,毕竟也写了三年qt了(笑),但是一直没有总结,然后年纪上去了之后发现基于记忆开发已经很勉强了!安装完毕后,打开vs2022,如图设置qt版本路径。下载完毕后手动安装即可。

2024-07-31 16:56:29 474

原创 QLibrary 加载失败

QLibrary 加载失败QLibrary 加载失败,输出显示加载对应dll后又卸载看看对应的dll库的依赖库是否完全

2022-05-18 15:37:11 1260

空空如也

空空如也

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

TA关注的人

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