- 博客(119)
- 收藏
- 关注
原创 Qt国际化
在全球化的今天,软件应用的国际化变得尤为重要。国际化不仅仅是翻译界面文本,更涉及到日期、时间、货币、数字格式等多方面的适应性调整。Qt作为一个强大的跨平台应用开发框架,提供了丰富的国际化支持工具,使得开发者可以轻松地将应用程序本地化到不同的语言和地区。本文将深入探讨Qt国际化的方方面面,包括工具使用、常见问题以及实际操作,帮助开发者掌握如何在Qt应用中实现高效的国际化,从而为全球用户提供更好的使用体验。
2024-08-02 17:44:40 1128
原创 Qt的事件处理机制、信号和槽以及两者之间的区别
本文详细介绍了Qt中的事件处理机制、信号和槽机制。并详细说明了信号和槽机制与事件系统是两个独立的系统,它们在内部工作方式上有所不同。最后以一个简单的按钮点击示例深入理解Qt中的事件处理机制、信号和槽机制的区别。
2024-08-02 17:44:03 1002
原创 Qt自定义带前后缀图标的PushButton
通过自定义QPushButton,重写paintEvent,同时保留setStyleSheet()设置的样式,来实现带前后缀图标的MPushButton,以满足特殊场景使用。这样实现的问题上面也有提到,自己绘制文本,需要考虑文本相关的样式(如text-align、padding)的影响。后续也可按需扩展维护hover、pressed、disabled状态的前后缀图标。
2024-07-25 16:41:34 693
原创 Qt样式表的底层实现原理
在Qt开发中,样式表(StyleSheet)是一个非常强大的工具,它允许我们通过类似于CSS的语法来定制控件的外观。然而,很多开发者对Qt样式表的底层实现原理并不清楚。本文将详细介绍Qt样式表的内部实现机制,并探讨在自定义控件中如何应用样式表。
2024-07-25 16:38:18 734
原创 Qt是如何在C++基础上扩展的
本文从0开始新建C++和Qt项目,以此展开Qt是如何在C++基础上扩展的。Qt项目较C++项目的编译流程中添加了moc、uic、qrc编译以支持Qt扩展。最后简单介绍了Qt的动态属性和Q_PROPERTY两个在C++基础上扩展的核心特性。像其他的GUI、信号和槽、模型/视图、插件、绘图、动画等核心特性,实际应用较多,这里不再赘述。
2024-07-19 20:15:02 910
原创 Qt中的高分辨率及缩放处理
如果希望当系统缩放设置增大时,应用能相应地缩小,以保持相同的视觉效果,可以自定义实现缩放处理。这通常被称为DPI缩放感知。注意这不是标准的缩放敏感性行为。通常,当用户增加系统的缩放设置时,他们期待更大的UI元素,以便在高分辨率上更容易阅读和操作。反过来,如果应用在用户增加系统缩放设置时缩小自己的UI,那么可能会引发用户的迷茫和困扰,因为他们把系统的缩放设置调大,却看到应用的UI反而变小了。大致原理如下:在软件初始化时,初始化并维护一个缩放因子。
2024-07-19 20:14:25 1706
原创 QtXlsx动态库编译(无需安装QtXlsx模块)
本文使用编译动态库的方式使用QtXlsx,而无需安装QtXlsx模块,方便快捷,将精力专注于使用而不是安装上面。
2024-04-11 11:44:27 848
原创 给你的Qt软件加个授权
环境:Win11 64位核心思路:将授权相关信息加密保存到License.txt中,软件运行时获取并解密授权信息,判断是否在限制期限内即可。加解密部分使用第三方openssl库进行,因此需要手动在项目中链接下openssl库,参考步骤如下。
2024-04-11 09:37:59 1299
原创 QCustomplot2实战示例
QCustomPlot是一个用于绘制交互式图表和图形的开源C++库。它为Qt应用程序提供了强大的绘图功能,可用于创建各种类型的图表,如线图、柱状图、散点图、饼图等。QCustomPlot具有灵活的配置选项,可以自定义图表的外观和行为。该库易于使用且功能强大,适用于需要在Qt应用程序中显示和操作图表数据的开发项目。
2024-01-12 17:13:41 1504
原创 乱码问题汇总
可以知道乱码的根本原因就是使用和数据源编码不一样的编码解码导致。如:BIG5解码GB2312编码内容,编解码不一致,必定会乱码。里有详细介绍、实现了各种方式的字符编码转换的接口,可按实际情况找到相应的接口转换。这里也记录下常见的乱码问题及解决方案供参考借鉴。
2024-01-12 17:12:41 1448
原创 字符编码转换
本文详细介绍了宽窄字符和字符编码之间的关系,同时归纳了两种宽窄字符转换的情况:**一种是保持原有字符编码不变,仅进行宽窄字符类型的转换**。**另一种是即进行宽窄字符类型的转换,也进行字符编码的转换**。并给出了对应的测试示例及测试结果。
2024-01-03 21:50:21 1354
原创 std::setlocale详解
std::setlocale是C++标准库中的一个函数,用于设置当前程序的本地化(locale)环境。setlocale 函数安装指定的系统本地环境或其一部分,作为新的 C 本地环境。修改保持效果,并影响所有关乎本地环境的 C 库函数执行,到下次调用 setlocale 为止。
2024-01-03 21:00:37 2088
原创 字符集&字符编码
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。而字符集(Character set)则是多个字符的集合。简单的说,字符集就规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、GBK字符集、GB18030字符集、BIG5字符集、Unicode字符集等。。
2024-01-03 20:49:33 1106
原创 Pimpl模式
类的常规实现和Pimpl实现各有优劣。若只是为了快速开发且没有对外隐藏需求,常规实现无疑是很好的选择,若想要减少编译依赖且不想对外展示私有成员,可选择使用Pimpl实现,代价就是开发及维护成本的提高。
2023-08-26 11:52:29 586
原创 Qt--QPlugin插件
自定义插件时,要先创建一个接口,作为插件类的基类。因为插件存储在一个dll中,因此可以动态的加载。创建一个插件包含以下几步:①定义一个接口类(只有纯虚函数的抽象类)②使用Q_DECLARE_INTERFACE()宏在Qt的元对象系统中注册该接口③再定义一个插件类,必须继承自QObject类和上面创建的接口类,且需先继承QObject④在插件类中使用Q_INTERFACE()宏在Qt的元对象系统中注册该接口⑤使用Q_PLUGIN_METADATa()宏导出该插件。
2023-08-06 11:24:20 1734
原创 Qt--动态链接库的创建和使用
综上,简单介绍了Qt动态链接库的创建和使用,使用时也分别示例的静态加载和动态加载的区别。需要注意的是:①静态加载添加.lib文件时,因Qt版本不同,可能需要加上.lib后缀。②动态加载时,只能加载extern"C"的全局函数,不能加载类,因此在Qt中,一般不会使用这种加载方式。若想使用动态加载,且用到导出类时,Qt中提供了QPluginLoader插件类来实现,这个会在之后的文章中详细介绍。
2023-08-05 11:55:49 2894
原创 网络编程--多线程服务器客户端
虽然使用互斥量实现了简单的多线程服务器/客户端,但也只是借此熟悉下线程及线程同步相关的接口,可以明显的看到效率还是比较低下的。要想使用高效的Windows服务器客户端,可以使用IOCP完成端口实现。
2023-05-30 21:49:45 905 2
原创 Qt--定时器事件和定时器类
使用定时器事件需要两步:①重写定时器事件函数②设置定时时间,开始定时例这里在Widget父窗口中重写定时器事件,并定时更新label内容。
2023-05-24 17:26:15 272
原创 Qt--事件过滤器
通过一个简单的示例熟悉事件过滤器的工作原理,同时也分析了和事件分发器的区别,相信在后续开发中,也可按照实际需要判断是否需要事件分发或过滤。
2023-05-24 16:55:02 4594
原创 Qt--事件分发器
在 Qt 中,事件分发器(Event Dispatcher)是一个核心概念,用于处理 GUI 应用程序中的事件。事件分发器负责将事件从一个对象传递到另一个对象,直到事件被处理或被取消。每个继承自QObject或QObject的类都可以在本类中重写bool event(QEvent *e),来实现相关事件的捕获和拦截。
2023-05-24 16:18:38 1265
原创 Qt--自定义控件
这里以 SpinBox和HorizontalSlider 组合的自定义控件为例,介绍常规的自定义控件的开发步骤。假设这里有一个Widget项目,作为工作项目。右键项目 -》添加新文件, 选择Qt -》Qt设计器界面类:选择自定义控件的父类:输入自定义控件类的名称:最后会给出添加的文件:添加完成后可以看到.pro文件中自动添加了自定义类的.h .cpp以及ui文件,另外在界面文件中,也多了一个smallwidget.ui文件:然后就可以在smallwidget.ui文件中设计我们的自定义控件了。
2023-05-24 14:59:03 6841 3
原创 Qt--信号和槽
在Qt中,若窗口或控件当前的信号和槽不满足自己的需求,或者想使自己定义的类拥有其特有的信号和槽,Qt是支持使用自定义的信号和槽的。自定义信号和槽,需注意:①自定义信号和槽的类需继承自 QObject。自定义信号和槽必须继承自 QObject,因为它们是 Qt 元对象系统的一部分。②使用 Q_OBJECT 宏。为了使自定义信号和槽能够在运行时调用其 metaObject() 方法,必须在类的头文件中使用 Q_OBJECT 宏进行标记。
2023-05-23 17:18:45 940
原创 Qt--对象树
Qt中的对象树机制,通俗来讲,就是当创建的对象,父窗口是QWidget或者是QObject派生下来的类,此对象就会放到父窗口的对象树上,当程序执行完毕,树上的内容会从下往上依次释放,而无需再手动释放。这里需要注意的,释放和析构的区别,这里的析构并不代表释放。析构只是清理一下相关信息,并没有真正释放对象。因此这里。如下:当释放最顶层Widget1窗口时,会。虽然从下往上释放,但也许通过上层窗口判断是否有子窗口,再执行子窗口的析构函数(这里没有释放),最后再执行释放。
2023-05-22 15:36:15 222
原创 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 104
原创 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 168
原创 网络编程--IOCP完成端口
在此之前,我们介绍了Windows网络编程中常见的几种IO模型及应用,相信后续在实际工作中碰到也能了解其实现,本文介绍的最后一种IO模型–IOCP完成端口在Windows网络编程中极为常见,因此需熟练掌握应用,本文的最后也简单分析了一下几种IO模型的差异以加深对几种IO模型的理解。至此,网络编程的学习将告一段落,这段的学习中均使用简单的回声服务器作为示例介绍,在更为复杂的工作环境中,应学会在公司现有框架中变通。
2023-05-22 12:20:14 687
原创 网络编程--纯重叠IO方式实现回声服务器
基于重叠IO模型,实现了一个简单的重叠IO回声服务器/客户端,以加深使用WSASend和WSARecv函数中LPWSAOVERLAPPED参数和Competion Routine方式处理IO完成的理解。
2023-05-22 10:53:58 675
原创 网络编程--重叠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 723
原创 网络编程--异步通知IO模型
同select实现IO复用一样,WSAEventSelect函数是实现异步通知IO模型的关键,因此也需熟练掌握。上文比较了通过select使用的同步通知IO模型和WSAEventSelect函数实现异步通知IO模型的差异及优缺点,同样也介绍了WSAEventSelect的相关扩展函数及使用步骤。最后给出了基于异步通知IO模型实现的回声服务器代码,可在实际工作中按需调整。
2023-05-18 16:13:27 761
原创 网络编程--select实现IO复用
select函数是实现IO复用服务器的关键,因此需要熟练掌握。这里也总结了select函数的使用步骤及示例模板,后续也可参考在实际开发时使用。步骤:①设置套接字②设置监视范围③设置超时④调用select函数⑤查看调用结果。
2023-05-18 11:48:04 777
原创 网络编程七--半关闭
此前的closesocket函数,调用后就会完全断开连接。完全断开后,不仅无法传输数据,也无法再接收数据。在某些场景下,完全断开连接可能会有些问题。若有两台主机正在进行双向通信。主机A发送完最后的数据后,调用closesocket函数断开连接(这里会将该套接字的输出缓存的数据全部发送出去),之后主机A无法再接收主机B正在传输的数据(实际上是完全无法调用与接收数据相关的函数)。为了解决这类问题,“只关闭一部分数据交换中使用的流(Half-close)”的方法应运而生。
2023-05-11 15:01:03 137
原创 网络编程五--自定义应用层协议
本章通过一个简单的运算示例介绍如何自定义应用层协议,所谓的协议就是为了完成数据交换而定好的约定,只不过这里的约定应用在了应用层,即输入前(客户端的应用层)、输出后(服务器端的应用层)的数据的处理方式。
2023-05-08 21:18:13 906
原创 网络编程--协议、协议族、地址族
通过socket函数声明展开了解协议族、数据传输方式以及最终协议的相关知识,此外还学习了IP的分类规则,知道IP和端口分别标识计算机和套接字,以及初始化时的地址的初始化相关的API说明。为了统一数据传输时的解析,这里引出了主机字节顺序和网络字节顺序,知道数据统一使用网络字节顺序传输,并介绍了主机字节顺序和网络字节顺序相互转换的API接口。
2023-04-25 18:03:00 1444
原创 网络编程二、回声服务器
实现一个简单的回声服务器及客户端.通过回声服务器/客户端实例,我们更加深刻的理解了TCP传输数据不存在边界的特性,即recv函数和send函数的调用次数并无太大意义,因为每次recv都会获取输入缓冲中的所有内容。也更加深刻理解了recv和send函数的应用,这里通过send和recv函数的返回值来实现完美的回声客户端。
2023-04-24 17:49:46 107
原创 C++11新标准之Lambda表达式
Lambda表达式以捕获列表[]开头,且必须包含Lambda主体,其他项可按需省略。关于捕获列表,需要注意的是 按值传递 的捕获的Lambda表达式是const的,无法更改其捕获的变量,可通过 引用传递 方式或mutable修饰符破坏其const特性。关于参数列表,需注意与普通函数参数列表的区别,同时无参数时可省略。关于可变规范,可通过mutable破坏以 值传递 捕获的Lambda表达式,注意使用mutable时不可省略参数列表。关于异常规范,一般不建议使用,但使用时不能省略参数列表。
2022-09-21 21:33:09 1719
原创 C++11新标准之std::function函数包装器
若不想通过typedef声明函数指针,或想保存Lambda表达式,则可以考虑使用std::function。
2022-09-21 20:09:13 819
原创 MFC框架程序解析
可以看到窗口的创建虽然都由MFC框架处理,但其实现原理依旧和Windows程序一样,即设计、注册、创建、显示刷新、进入消息循环这一步骤。优点就是前面提到的简化程序员的开发工作,但可以明显感觉到MFC框架对Windows系统的依赖性,这就限制了其对跨平台的支持。
2022-09-14 22:34:44 1692
原创 Windows程序运行机制
通过该示例了解Windows应用程序的内部运行机制, 即:①设计一个窗口类②注册窗口类③创建窗口④显示/刷新窗口⑤进入消息循环需要注意的是:①设计窗口类是必须明确的指定光标②必须注册已设计的窗口类, Windows系统会为每个窗口类维护一个WNDCLASS结构体③必须创建已注册的窗口类④第一次显示窗口时应该指定SW_NORMAL。
2022-09-13 20:23:20 923
空空如也
#C++#类的静态成员函数竟可调用虚函数, 如何解释?
2022-08-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人