![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 77
SNAKEpc12138
这个作者很懒,什么都没留下…
展开
-
Qt是如何在C++基础上扩展的
本文从0开始新建C++和Qt项目,以此展开Qt是如何在C++基础上扩展的。Qt项目较C++项目的编译流程中添加了moc、uic、qrc编译以支持Qt扩展。最后简单介绍了Qt的动态属性和Q_PROPERTY两个在C++基础上扩展的核心特性。像其他的GUI、信号和槽、模型/视图、插件、绘图、动画等核心特性,实际应用较多,这里不再赘述。原创 2024-07-19 20:15:02 · 684 阅读 · 0 评论 -
Qt中的高分辨率及缩放处理
如果希望当系统缩放设置增大时,应用能相应地缩小,以保持相同的视觉效果,可以自定义实现缩放处理。这通常被称为DPI缩放感知。注意这不是标准的缩放敏感性行为。通常,当用户增加系统的缩放设置时,他们期待更大的UI元素,以便在高分辨率上更容易阅读和操作。反过来,如果应用在用户增加系统缩放设置时缩小自己的UI,那么可能会引发用户的迷茫和困扰,因为他们把系统的缩放设置调大,却看到应用的UI反而变小了。大致原理如下:在软件初始化时,初始化并维护一个缩放因子。原创 2024-07-19 20:14:25 · 356 阅读 · 0 评论 -
QtXlsx动态库编译(无需安装QtXlsx模块)
本文使用编译动态库的方式使用QtXlsx,而无需安装QtXlsx模块,方便快捷,将精力专注于使用而不是安装上面。原创 2024-04-11 11:44:27 · 636 阅读 · 0 评论 -
给你的Qt软件加个授权
环境:Win11 64位核心思路:将授权相关信息加密保存到License.txt中,软件运行时获取并解密授权信息,判断是否在限制期限内即可。加解密部分使用第三方openssl库进行,因此需要手动在项目中链接下openssl库,参考步骤如下。原创 2024-04-11 09:37:59 · 776 阅读 · 0 评论 -
乱码问题汇总
可以知道乱码的根本原因就是使用和数据源编码不一样的编码解码导致。如:BIG5解码GB2312编码内容,编解码不一致,必定会乱码。里有详细介绍、实现了各种方式的字符编码转换的接口,可按实际情况找到相应的接口转换。这里也记录下常见的乱码问题及解决方案供参考借鉴。原创 2024-01-12 17:12:41 · 1249 阅读 · 0 评论 -
QCustomplot2实战示例
QCustomPlot是一个用于绘制交互式图表和图形的开源C++库。它为Qt应用程序提供了强大的绘图功能,可用于创建各种类型的图表,如线图、柱状图、散点图、饼图等。QCustomPlot具有灵活的配置选项,可以自定义图表的外观和行为。该库易于使用且功能强大,适用于需要在Qt应用程序中显示和操作图表数据的开发项目。原创 2024-01-12 17:13:41 · 1263 阅读 · 0 评论 -
字符编码转换
本文详细介绍了宽窄字符和字符编码之间的关系,同时归纳了两种宽窄字符转换的情况:**一种是保持原有字符编码不变,仅进行宽窄字符类型的转换**。**另一种是即进行宽窄字符类型的转换,也进行字符编码的转换**。并给出了对应的测试示例及测试结果。原创 2024-01-03 21:50:21 · 1255 阅读 · 0 评论 -
std::setlocale详解
std::setlocale是C++标准库中的一个函数,用于设置当前程序的本地化(locale)环境。setlocale 函数安装指定的系统本地环境或其一部分,作为新的 C 本地环境。修改保持效果,并影响所有关乎本地环境的 C 库函数执行,到下次调用 setlocale 为止。原创 2024-01-03 21:00:37 · 1591 阅读 · 0 评论 -
字符集&字符编码
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。而字符集(Character set)则是多个字符的集合。简单的说,字符集就规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、GBK字符集、GB18030字符集、BIG5字符集、Unicode字符集等。。原创 2024-01-03 20:49:33 · 922 阅读 · 0 评论 -
Pimpl模式
类的常规实现和Pimpl实现各有优劣。若只是为了快速开发且没有对外隐藏需求,常规实现无疑是很好的选择,若想要减少编译依赖且不想对外展示私有成员,可选择使用Pimpl实现,代价就是开发及维护成本的提高。原创 2023-08-26 11:52:29 · 557 阅读 · 0 评论 -
网络编程--多线程服务器客户端
虽然使用互斥量实现了简单的多线程服务器/客户端,但也只是借此熟悉下线程及线程同步相关的接口,可以明显的看到效率还是比较低下的。要想使用高效的Windows服务器客户端,可以使用IOCP完成端口实现。原创 2023-05-30 21:49:45 · 766 阅读 · 2 评论 -
Qt--定时器事件和定时器类
使用定时器事件需要两步:①重写定时器事件函数②设置定时时间,开始定时例这里在Widget父窗口中重写定时器事件,并定时更新label内容。原创 2023-05-24 17:26:15 · 217 阅读 · 0 评论 -
Qt--事件过滤器
通过一个简单的示例熟悉事件过滤器的工作原理,同时也分析了和事件分发器的区别,相信在后续开发中,也可按照实际需要判断是否需要事件分发或过滤。原创 2023-05-24 16:55:02 · 4263 阅读 · 0 评论 -
Qt--事件分发器
在 Qt 中,事件分发器(Event Dispatcher)是一个核心概念,用于处理 GUI 应用程序中的事件。事件分发器负责将事件从一个对象传递到另一个对象,直到事件被处理或被取消。每个继承自QObject或QObject的类都可以在本类中重写bool event(QEvent *e),来实现相关事件的捕获和拦截。原创 2023-05-24 16:18:38 · 1143 阅读 · 0 评论 -
Qt--信号和槽
在Qt中,若窗口或控件当前的信号和槽不满足自己的需求,或者想使自己定义的类拥有其特有的信号和槽,Qt是支持使用自定义的信号和槽的。自定义信号和槽,需注意:①自定义信号和槽的类需继承自 QObject。自定义信号和槽必须继承自 QObject,因为它们是 Qt 元对象系统的一部分。②使用 Q_OBJECT 宏。为了使自定义信号和槽能够在运行时调用其 metaObject() 方法,必须在类的头文件中使用 Q_OBJECT 宏进行标记。原创 2023-05-23 17:18:45 · 832 阅读 · 0 评论 -
Qt--对象树
Qt中的对象树机制,通俗来讲,就是当创建的对象,父窗口是QWidget或者是QObject派生下来的类,此对象就会放到父窗口的对象树上,当程序执行完毕,树上的内容会从下往上依次释放,而无需再手动释放。这里需要注意的,释放和析构的区别,这里的析构并不代表释放。析构只是清理一下相关信息,并没有真正释放对象。因此这里。如下:当释放最顶层Widget1窗口时,会。虽然从下往上释放,但也许通过上层窗口判断是否有子窗口,再执行子窗口的析构函数(这里没有释放),最后再执行释放。原创 2023-05-22 15:36:15 · 167 阅读 · 0 评论 -
Qt--快捷键
帮助文档 F1 或 左侧帮助 或 安装目录下的assistant.exe,例我的安装目录为:D:\QtInstallPath\6.5.0\mingw_64\bin\assistant.exe。整行移动 ctrl + shift + ⬆ 或 ⬇。字体缩放 ctrl + 鼠标滚轮。自动对齐 ctrrl + i。查找/替换 ctrl + f。同名h和cpp文件切换 F4。运行 ctrl + r。编译 ctrl + b。注释 ctrl + /原创 2023-05-22 14:56:50 · 74 阅读 · 0 评论 -
Qt--工程文件
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //大于4版本则包含widgets模块。SOURCES += \ //当前项目包含的源文件,每次新建类时会自动在此添加。HEADERS += \ //项目中包含的头文件,每次新建类时会自动在此添加。TARGET = firsttest //生成的exe文件的名称,可按需修改。QT += core gui //Qt包含的模块,可按需添加。原创 2023-05-22 14:44:43 · 132 阅读 · 0 评论 -
网络编程--IOCP完成端口
在此之前,我们介绍了Windows网络编程中常见的几种IO模型及应用,相信后续在实际工作中碰到也能了解其实现,本文介绍的最后一种IO模型–IOCP完成端口在Windows网络编程中极为常见,因此需熟练掌握应用,本文的最后也简单分析了一下几种IO模型的差异以加深对几种IO模型的理解。至此,网络编程的学习将告一段落,这段的学习中均使用简单的回声服务器作为示例介绍,在更为复杂的工作环境中,应学会在公司现有框架中变通。原创 2023-05-22 12:20:14 · 622 阅读 · 0 评论 -
网络编程--纯重叠IO方式实现回声服务器
基于重叠IO模型,实现了一个简单的重叠IO回声服务器/客户端,以加深使用WSASend和WSARecv函数中LPWSAOVERLAPPED参数和Competion Routine方式处理IO完成的理解。原创 2023-05-22 10:53:58 · 586 阅读 · 0 评论 -
网络编程--重叠IO模型
一文中介绍的异步通知IO模型属于通知IO模型,类似的一文中介绍的IO复用也属于通信IO模型。何谓通知IO模型,就是IO完成给通知开发人员,某个IO操作已完成,根据通知的时机,又分为为同步通知IO模型(select实现IO复用)和异步通知IO模型(WSAEventSelect实现异步通知IO模型)。这里再回看前两种模型实现,发现都是使用的同步的IO函数send和recv,只是在该调用的时机(IO完成)调用。而本章则会介绍以异步方式处理IO,注意区别于前两种通知模型及同步IO函数。原创 2023-05-18 18:00:31 · 639 阅读 · 0 评论 -
网络编程--异步通知IO模型
同select实现IO复用一样,WSAEventSelect函数是实现异步通知IO模型的关键,因此也需熟练掌握。上文比较了通过select使用的同步通知IO模型和WSAEventSelect函数实现异步通知IO模型的差异及优缺点,同样也介绍了WSAEventSelect的相关扩展函数及使用步骤。最后给出了基于异步通知IO模型实现的回声服务器代码,可在实际工作中按需调整。原创 2023-05-18 16:13:27 · 724 阅读 · 0 评论 -
网络编程--select实现IO复用
select函数是实现IO复用服务器的关键,因此需要熟练掌握。这里也总结了select函数的使用步骤及示例模板,后续也可参考在实际开发时使用。步骤:①设置套接字②设置监视范围③设置超时④调用select函数⑤查看调用结果。原创 2023-05-18 11:48:04 · 710 阅读 · 0 评论 -
网络编程七--半关闭
此前的closesocket函数,调用后就会完全断开连接。完全断开后,不仅无法传输数据,也无法再接收数据。在某些场景下,完全断开连接可能会有些问题。若有两台主机正在进行双向通信。主机A发送完最后的数据后,调用closesocket函数断开连接(这里会将该套接字的输出缓存的数据全部发送出去),之后主机A无法再接收主机B正在传输的数据(实际上是完全无法调用与接收数据相关的函数)。为了解决这类问题,“只关闭一部分数据交换中使用的流(Half-close)”的方法应运而生。原创 2023-05-11 15:01:03 · 105 阅读 · 0 评论 -
网络编程六--UDP服务器客户端
通过一个简单UDP服务器/客户端示例理解UDP的特性、开发步骤及开发过程中的优化处理原创 2023-05-10 17:55:16 · 2557 阅读 · 0 评论 -
网络编程五--自定义应用层协议
本章通过一个简单的运算示例介绍如何自定义应用层协议,所谓的协议就是为了完成数据交换而定好的约定,只不过这里的约定应用在了应用层,即输入前(客户端的应用层)、输出后(服务器端的应用层)的数据的处理方式。原创 2023-05-08 21:18:13 · 847 阅读 · 0 评论 -
网络编程--协议、协议族、地址族
通过socket函数声明展开了解协议族、数据传输方式以及最终协议的相关知识,此外还学习了IP的分类规则,知道IP和端口分别标识计算机和套接字,以及初始化时的地址的初始化相关的API说明。为了统一数据传输时的解析,这里引出了主机字节顺序和网络字节顺序,知道数据统一使用网络字节顺序传输,并介绍了主机字节顺序和网络字节顺序相互转换的API接口。原创 2023-04-25 18:03:00 · 1136 阅读 · 0 评论 -
网络编程二、回声服务器
实现一个简单的回声服务器及客户端.通过回声服务器/客户端实例,我们更加深刻的理解了TCP传输数据不存在边界的特性,即recv函数和send函数的调用次数并无太大意义,因为每次recv都会获取输入缓冲中的所有内容。也更加深刻理解了recv和send函数的应用,这里通过send和recv函数的返回值来实现完美的回声客户端。原创 2023-04-24 17:49:46 · 86 阅读 · 0 评论 -
动态链接库--导出类(二)
在使用导出的纯虚类时, 实际调用借助了继承体系中的多态机制, 使用父类指针指向子类对象, 因此会调用子类的实现, 即使子类未导出, 因为这里的调用发生在DLL模块中而不在 使用项目的模块中.这种方式比较好,通用,产生的DLL没有特定环境限制. 借助了C++类的虚函数, 一般都是采用这种方式.除了对DLL导出类有好处外,采用接口跟实现分离,可以使得工程的结构更清晰,使用者只需要知道接口,而不需要知道实现....原创 2022-08-27 10:48:46 · 825 阅读 · 0 评论 -
动态链接库(八)--二次开发dll
无论是C编译生成的dll, 还是C++编译生成的dll,若其没有解决 不同编译器 或 不同调用约定 导致的名字改编问题,都可以通过在封装一层的方式去解决原始dll中没有解决的名字改编问题。原创 2022-08-13 16:20:51 · 1636 阅读 · 0 评论 -
动态链接库(扩展)--实际开发时的注意事项
无论是C编写dll 给 C++项目用, 还是 C++编写dll 给 C项目 用, 解决不同编译器导致和不同调用约定导致的名字改编问题均可通过以下两步解决:①动态链接库(六)–解决不同编译器导致的名字改编问题②动态链接库(七)–解决不同调用约定导致的名字改编问题其中需要注意的是 exten “C” 限定符下不能有与C无关的代码出现.此外, 对于C++支持的重载函数的 不同调用约定导致的名字改编问题。...原创 2022-08-11 19:44:51 · 597 阅读 · 0 评论 -
动态链接库(七)--解决不同调用约定导致的名字改编问题
综上,我们可以指定使用extern “C” 限定符解决不同编译器导致的名字改编问题,使用模块定义文件解决不同调用约定导致的名字改编问题.extern “C” 只能解决不同编译器导致的名字改编问题,而不能解决不同调用约定导致的名字改编问题.同理,模块定义文件只能解决不同调用约定导致的名字改编问题,而不能解决不同编译器导致的名字改编问题.若使用Dll的项目的编译环境和调用约定均和DLL导出函数的不同,两种方式需组合使用.此外,我们还了解了在项目中调用DLL头文件声明的函数时,...原创 2022-08-10 21:53:08 · 802 阅读 · 0 评论 -
动态链接库(扩展)--调用约定
简单介绍动态链接库中如何指定导出函数的调用约定, 指定调用约定时的注意事项, C和C++编译器下各调用约定的命名规则 以及各调用约定之间的区别原创 2022-08-10 20:58:02 · 581 阅读 · 0 评论 -
动态链接库--dll使用示例
无论是vs2010还是vs2013,只要是C编译生成的Dll,即使发生了不同调用约定导致的名字改编,也都能在其他编译器的项目中通过原始函数名调用.这是因为在CTest项目包含的Dll1.h头文件中,显式的指明了C编译和__stdcall调用约定, 因此通过原始函数名调用时就会以 C编译__stdcall调用约定的改编规则名_add@8 和 _subtract@8 去dll查找对应实现....原创 2022-08-10 20:30:24 · 1047 阅读 · 0 评论 -
动态链接库(六)--解决不同编译环境导致的名字改编问题
通过示例简单介绍编写动态链接库时解决不同编译环境导致的名字改编问题, 即统一编译环境. 本文示例中通过extern "c" 限定符以统一C编译方式解决名字改编问题.原创 2022-08-08 20:36:22 · 616 阅读 · 0 评论 -
动态链接库(五)--导出类
动态链接库中导出类的简单示例, 发现并不可以导出类的成员变量.原创 2022-08-08 19:53:46 · 1636 阅读 · 0 评论 -
动态链接库(四)--优化动态链接库的创建和使用
添加dll包含文件(.h)以优化动态链接库的创建和使用原创 2022-08-06 10:16:24 · 534 阅读 · 0 评论 -
动态链接库(三)--动态链接库的使用
简单学习在自己的项目中使用他人创建的动态链接库, 介绍了隐式静态加载和显式动态加载两种加载动态链接库的方式.原创 2022-08-06 09:39:07 · 3239 阅读 · 5 评论 -
动态链接库(二)--动态链接库的创建
创建一个简单的动态链接库, 扩展介绍了不同编译器及调用约定导致的名字改编规则原创 2022-08-04 21:19:00 · 1935 阅读 · 0 评论 -
STL之queue
STL中的queue容器简介原创 2022-07-26 20:05:49 · 542 阅读 · 0 评论