- 博客(126)
- 收藏
- 关注
原创 一键换肤的Qt-Advanced-Stylesheets
通过对Qt-Advanced-Stylesheets源码阅读及本地调试,剖析了Qt-Advanced-Stylesheets项目一键动态切换主题功能的核心实现,即通过不同的风格 -> 主题 -> 样式配置架构管控软件整体风格样式。需要注意的是控件相关样式设置需在CSS文件中配置,若在代码或ui文件中设置会无法动态切换,同时需要注意css文件中的颜色值需要通过颜色模板变量而不是具体数值设置。而对于混框架(如Qt + MFC)大型项目的一键切换风格主题样式,能否借鉴该实现方式,有待商榷。
2025-03-11 21:15:03
860
原创 Qt开源控件库(qt-material-widgets)的编译及使用
综上,本文通过简单示例,详细介绍了自己克隆并编译开源控件库,然后应用在自己的项目中的完整流程及注意事项。通过该开源控件库项目,可学到动态库项目的编译和使用以及pimpl设计模式在项目中的实际应用,相信对实际工作会有一定的帮助。
2025-03-11 21:05:28
1295
原创 DBus名词术语命名规范详解:构建清晰、规范的DBus通信
DBus的命名规范是确保DBus通信清晰性和规范性的关键。通过本文的详细解析,相信您对DBus中涉及的名词术语的命名规范有了更全面的理解。在实际项目中,遵循DBus命名规范可以显著提升代码的可读性和可维护性,同时确保不同应用程序和服务之间的兼容性。
2025-03-07 21:09:12
849
原创 ❌Manus?✅OpenManus + DeepSeek!!!
Manus 是由中国团队 Monica.im 开发的全球首款通用型 AI Agent(智能体)产品。其名称源自拉丁文 “mens et manus”(知行合一),强调“手脑并用”的能力——不仅能思考,还能自主执行复杂任务并交付成果。
2025-03-07 21:02:25
1335
2
原创 QDBus:Qt对DBus的封装支持
QDBusAbstractAdaptor用于将本地Qt对象暴露为DBus服务。通过继承QDBusAbstractAdaptor,开发者可以将Qt对象的信号、槽和属性暴露给DBus总线,供其他进程调用。Q_OBJECTQ_OBJECTpublic:QDBus是Qt框架中用于DBus通信的核心模块,它将DBus协议的复杂性与Qt的信号槽机制结合,为开发者提供了高效、易用的进程间通信工具。通过本文的深入解析,相信您对QDBus的关键特性、核心概念和应用场景有了更全面的理解。
2025-03-05 19:12:55
757
原创 深入解析DBus协议:关键特性与核心概念
DBus协议为Linux桌面环境和系统服务提供了一种高效、灵活的进程间通信机制。通过本文的深入解析,相信您对DBus协议的关键特性、核心概念和应用场景有了更全面的理解。在实际项目中,合理使用DBus可以显著提升系统的模块化和灵活性。
2025-03-04 22:07:28
691
原创 浅谈开发环境
工欲善其事,必先利其器。工作中经常用到的各种’东西’,如CMake、QMake、Make、MSBuildCLang、GCC、MinGW、MSVC等,有些在命名上有些类似,实际作用却不尽相同。因此这里换个角度来了解下这些‘东西’的作用,以及这些‘东西’之间的联系。
2025-03-04 22:04:12
884
原创 Qt国际化
在全球化的今天,软件应用的国际化变得尤为重要。国际化不仅仅是翻译界面文本,更涉及到日期、时间、货币、数字格式等多方面的适应性调整。Qt作为一个强大的跨平台应用开发框架,提供了丰富的国际化支持工具,使得开发者可以轻松地将应用程序本地化到不同的语言和地区。本文将深入探讨Qt国际化的方方面面,包括工具使用、常见问题以及实际操作,帮助开发者掌握如何在Qt应用中实现高效的国际化,从而为全球用户提供更好的使用体验。
2024-08-02 17:44:40
1278
2
原创 Qt的事件处理机制、信号和槽以及两者之间的区别
本文详细介绍了Qt中的事件处理机制、信号和槽机制。并详细说明了信号和槽机制与事件系统是两个独立的系统,它们在内部工作方式上有所不同。最后以一个简单的按钮点击示例深入理解Qt中的事件处理机制、信号和槽机制的区别。
2024-08-02 17:44:03
1269
原创 Qt自定义带前后缀图标的PushButton
通过自定义QPushButton,重写paintEvent,同时保留setStyleSheet()设置的样式,来实现带前后缀图标的MPushButton,以满足特殊场景使用。这样实现的问题上面也有提到,自己绘制文本,需要考虑文本相关的样式(如text-align、padding)的影响。后续也可按需扩展维护hover、pressed、disabled状态的前后缀图标。
2024-07-25 16:41:34
769
原创 Qt样式表的底层实现原理
在Qt开发中,样式表(StyleSheet)是一个非常强大的工具,它允许我们通过类似于CSS的语法来定制控件的外观。然而,很多开发者对Qt样式表的底层实现原理并不清楚。本文将详细介绍Qt样式表的内部实现机制,并探讨在自定义控件中如何应用样式表。
2024-07-25 16:38:18
864
原创 Qt是如何在C++基础上扩展的
本文从0开始新建C++和Qt项目,以此展开Qt是如何在C++基础上扩展的。Qt项目较C++项目的编译流程中添加了moc、uic、qrc编译以支持Qt扩展。最后简单介绍了Qt的动态属性和Q_PROPERTY两个在C++基础上扩展的核心特性。像其他的GUI、信号和槽、模型/视图、插件、绘图、动画等核心特性,实际应用较多,这里不再赘述。
2024-07-19 20:15:02
975
原创 Qt中的高分辨率及缩放处理
如果希望当系统缩放设置增大时,应用能相应地缩小,以保持相同的视觉效果,可以自定义实现缩放处理。这通常被称为DPI缩放感知。注意这不是标准的缩放敏感性行为。通常,当用户增加系统的缩放设置时,他们期待更大的UI元素,以便在高分辨率上更容易阅读和操作。反过来,如果应用在用户增加系统缩放设置时缩小自己的UI,那么可能会引发用户的迷茫和困扰,因为他们把系统的缩放设置调大,却看到应用的UI反而变小了。大致原理如下:在软件初始化时,初始化并维护一个缩放因子。
2024-07-19 20:14:25
2433
原创 QtXlsx动态库编译(无需安装QtXlsx模块)
本文使用编译动态库的方式使用QtXlsx,而无需安装QtXlsx模块,方便快捷,将精力专注于使用而不是安装上面。
2024-04-11 11:44:27
1021
原创 给你的Qt软件加个授权
环境:Win11 64位核心思路:将授权相关信息加密保存到License.txt中,软件运行时获取并解密授权信息,判断是否在限制期限内即可。加解密部分使用第三方openssl库进行,因此需要手动在项目中链接下openssl库,参考步骤如下。
2024-04-11 09:37:59
1791
原创 QCustomplot2实战示例
QCustomPlot是一个用于绘制交互式图表和图形的开源C++库。它为Qt应用程序提供了强大的绘图功能,可用于创建各种类型的图表,如线图、柱状图、散点图、饼图等。QCustomPlot具有灵活的配置选项,可以自定义图表的外观和行为。该库易于使用且功能强大,适用于需要在Qt应用程序中显示和操作图表数据的开发项目。
2024-01-12 17:13:41
1725
原创 乱码问题汇总
可以知道乱码的根本原因就是使用和数据源编码不一样的编码解码导致。如:BIG5解码GB2312编码内容,编解码不一致,必定会乱码。里有详细介绍、实现了各种方式的字符编码转换的接口,可按实际情况找到相应的接口转换。这里也记录下常见的乱码问题及解决方案供参考借鉴。
2024-01-12 17:12:41
1617
原创 字符编码转换
本文详细介绍了宽窄字符和字符编码之间的关系,同时归纳了两种宽窄字符转换的情况:**一种是保持原有字符编码不变,仅进行宽窄字符类型的转换**。**另一种是即进行宽窄字符类型的转换,也进行字符编码的转换**。并给出了对应的测试示例及测试结果。
2024-01-03 21:50:21
1561
原创 std::setlocale详解
std::setlocale是C++标准库中的一个函数,用于设置当前程序的本地化(locale)环境。setlocale 函数安装指定的系统本地环境或其一部分,作为新的 C 本地环境。修改保持效果,并影响所有关乎本地环境的 C 库函数执行,到下次调用 setlocale 为止。
2024-01-03 21:00:37
2518
原创 字符集&字符编码
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。而字符集(Character set)则是多个字符的集合。简单的说,字符集就规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、GBK字符集、GB18030字符集、BIG5字符集、Unicode字符集等。。
2024-01-03 20:49:33
1340
原创 Pimpl模式
类的常规实现和Pimpl实现各有优劣。若只是为了快速开发且没有对外隐藏需求,常规实现无疑是很好的选择,若想要减少编译依赖且不想对外展示私有成员,可选择使用Pimpl实现,代价就是开发及维护成本的提高。
2023-08-26 11:52:29
610
原创 Qt--QPlugin插件
自定义插件时,要先创建一个接口,作为插件类的基类。因为插件存储在一个dll中,因此可以动态的加载。创建一个插件包含以下几步:①定义一个接口类(只有纯虚函数的抽象类)②使用Q_DECLARE_INTERFACE()宏在Qt的元对象系统中注册该接口③再定义一个插件类,必须继承自QObject类和上面创建的接口类,且需先继承QObject④在插件类中使用Q_INTERFACE()宏在Qt的元对象系统中注册该接口⑤使用Q_PLUGIN_METADATa()宏导出该插件。
2023-08-06 11:24:20
1835
原创 Qt--动态链接库的创建和使用
综上,简单介绍了Qt动态链接库的创建和使用,使用时也分别示例的静态加载和动态加载的区别。需要注意的是:①静态加载添加.lib文件时,因Qt版本不同,可能需要加上.lib后缀。②动态加载时,只能加载extern"C"的全局函数,不能加载类,因此在Qt中,一般不会使用这种加载方式。若想使用动态加载,且用到导出类时,Qt中提供了QPluginLoader插件类来实现,这个会在之后的文章中详细介绍。
2023-08-05 11:55:49
3022
原创 网络编程--多线程服务器客户端
虽然使用互斥量实现了简单的多线程服务器/客户端,但也只是借此熟悉下线程及线程同步相关的接口,可以明显的看到效率还是比较低下的。要想使用高效的Windows服务器客户端,可以使用IOCP完成端口实现。
2023-05-30 21:49:45
960
2
原创 Qt--定时器事件和定时器类
使用定时器事件需要两步:①重写定时器事件函数②设置定时时间,开始定时例这里在Widget父窗口中重写定时器事件,并定时更新label内容。
2023-05-24 17:26:15
310
原创 Qt--事件过滤器
通过一个简单的示例熟悉事件过滤器的工作原理,同时也分析了和事件分发器的区别,相信在后续开发中,也可按照实际需要判断是否需要事件分发或过滤。
2023-05-24 16:55:02
4814
原创 Qt--事件分发器
在 Qt 中,事件分发器(Event Dispatcher)是一个核心概念,用于处理 GUI 应用程序中的事件。事件分发器负责将事件从一个对象传递到另一个对象,直到事件被处理或被取消。每个继承自QObject或QObject的类都可以在本类中重写bool event(QEvent *e),来实现相关事件的捕获和拦截。
2023-05-24 16:18:38
1327
原创 Qt--自定义控件
这里以 SpinBox和HorizontalSlider 组合的自定义控件为例,介绍常规的自定义控件的开发步骤。假设这里有一个Widget项目,作为工作项目。右键项目 -》添加新文件, 选择Qt -》Qt设计器界面类:选择自定义控件的父类:输入自定义控件类的名称:最后会给出添加的文件:添加完成后可以看到.pro文件中自动添加了自定义类的.h .cpp以及ui文件,另外在界面文件中,也多了一个smallwidget.ui文件:然后就可以在smallwidget.ui文件中设计我们的自定义控件了。
2023-05-24 14:59:03
6971
3
原创 Qt--信号和槽
在Qt中,若窗口或控件当前的信号和槽不满足自己的需求,或者想使自己定义的类拥有其特有的信号和槽,Qt是支持使用自定义的信号和槽的。自定义信号和槽,需注意:①自定义信号和槽的类需继承自 QObject。自定义信号和槽必须继承自 QObject,因为它们是 Qt 元对象系统的一部分。②使用 Q_OBJECT 宏。为了使自定义信号和槽能够在运行时调用其 metaObject() 方法,必须在类的头文件中使用 Q_OBJECT 宏进行标记。
2023-05-23 17:18:45
1024
原创 Qt--对象树
Qt中的对象树机制,通俗来讲,就是当创建的对象,父窗口是QWidget或者是QObject派生下来的类,此对象就会放到父窗口的对象树上,当程序执行完毕,树上的内容会从下往上依次释放,而无需再手动释放。这里需要注意的,释放和析构的区别,这里的析构并不代表释放。析构只是清理一下相关信息,并没有真正释放对象。因此这里。如下:当释放最顶层Widget1窗口时,会。虽然从下往上释放,但也许通过上层窗口判断是否有子窗口,再执行子窗口的析构函数(这里没有释放),最后再执行释放。
2023-05-22 15:36:15
254
原创 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
117
原创 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
181
原创 网络编程--IOCP完成端口
在此之前,我们介绍了Windows网络编程中常见的几种IO模型及应用,相信后续在实际工作中碰到也能了解其实现,本文介绍的最后一种IO模型–IOCP完成端口在Windows网络编程中极为常见,因此需熟练掌握应用,本文的最后也简单分析了一下几种IO模型的差异以加深对几种IO模型的理解。至此,网络编程的学习将告一段落,这段的学习中均使用简单的回声服务器作为示例介绍,在更为复杂的工作环境中,应学会在公司现有框架中变通。
2023-05-22 12:20:14
743
原创 网络编程--纯重叠IO方式实现回声服务器
基于重叠IO模型,实现了一个简单的重叠IO回声服务器/客户端,以加深使用WSASend和WSARecv函数中LPWSAOVERLAPPED参数和Competion Routine方式处理IO完成的理解。
2023-05-22 10:53:58
713
原创 网络编程--重叠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
815
原创 网络编程--异步通知IO模型
同select实现IO复用一样,WSAEventSelect函数是实现异步通知IO模型的关键,因此也需熟练掌握。上文比较了通过select使用的同步通知IO模型和WSAEventSelect函数实现异步通知IO模型的差异及优缺点,同样也介绍了WSAEventSelect的相关扩展函数及使用步骤。最后给出了基于异步通知IO模型实现的回声服务器代码,可在实际工作中按需调整。
2023-05-18 16:13:27
798
原创 网络编程--select实现IO复用
select函数是实现IO复用服务器的关键,因此需要熟练掌握。这里也总结了select函数的使用步骤及示例模板,后续也可参考在实际开发时使用。步骤:①设置套接字②设置监视范围③设置超时④调用select函数⑤查看调用结果。
2023-05-18 11:48:04
817
原创 网络编程七--半关闭
此前的closesocket函数,调用后就会完全断开连接。完全断开后,不仅无法传输数据,也无法再接收数据。在某些场景下,完全断开连接可能会有些问题。若有两台主机正在进行双向通信。主机A发送完最后的数据后,调用closesocket函数断开连接(这里会将该套接字的输出缓存的数据全部发送出去),之后主机A无法再接收主机B正在传输的数据(实际上是完全无法调用与接收数据相关的函数)。为了解决这类问题,“只关闭一部分数据交换中使用的流(Half-close)”的方法应运而生。
2023-05-11 15:01:03
157
空空如也
#C++#类的静态成员函数竟可调用虚函数, 如何解释?
2022-08-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人