「 QT 」
March 18, 2020
Words count
684
Reading time
1 mins.
前言
通过官网,我们可以了解到Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具,它有几个优点:
- 为每个泄漏的块提供完整的堆栈跟踪,包括可用的源文件和行号信息。
- 检测大多数(如果不是全部)进程内内存泄漏类型,包括基于COM的泄漏和基于Win32 / Win64堆的纯泄漏
- 所选模块(DLL或什至是主EXE)可以从泄漏检测中排除
- 提供泄漏块的完整数据转储(十六进制和ASCII)
- 可定制的内存泄漏报告:可以保存到文件或发送到调试器,并且可以包含可变...
Read article
「 QT 」
January 16, 2020
Words count
7.7k
Reading time
7 mins.
前言
假如将一些耗时操作放在UI线程处理,会导致UI卡顿,影响用户使用体验。因此,我们通常会将耗时操作放在新的线程中处理。这就涉及到线程的使用。在qt中,有几种方式启动多线程:
- 继承QThread,重新实现run()函数
- 使用QObject::moveToThread()函数
- 使用QtConcurrent模块
具体实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49... |
Read article
「 QT 」
January 16, 2020
Words count
4.5k
Reading time
4 mins.
前言
在项目中,会遇到这么一个需求,应用程序只能存在一个运行实例。关于这需求,网上流行几种实现方式:
- 通过QSharedMemory实现
- 使用官方提供的QTSingleApplication
- 使用QLocalServer和QLocalSocket
本文章主要介绍第三种方式
实现思路
- 继承QApplicaiton或者QCoreApplication自定义一个SingleApplication
- 在SingleApplication构造函数中创建一个QLocalSocket连接指定server_name...
Read article
「 QT 」
January 15, 2020
Words count
4.7k
Reading time
4 mins.
前言
在上一篇粘包的文章中提到,解决粘包的一种方式是,自定义消息,在消息头中增加包总长度的信息。不管tcp还是命名管道,都是以字节流的方式传递给接收者的。在解包的过程中,需要将头部的总长度信息提取出来,这就涉及到字节数字与int之间的转换。
另外,在不同的操作系统、处理器,数据的存储还有大小端之分:高位在前低位在后,低位在前高位在后。因此需要提供两种转换模式
具体代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38... |
Read article
「 QT 」
January 15, 2020
Words count
652
Reading time
1 mins.
前言
不管是走命名管道还是TCP/IP的方式,都会有粘包的问题发生。粘包的产生的原因可以这么理解:客户端与服务器维持一个长连接,在连接不断开的情况下,可以持续不断地进行数据的交互。一个完整的包可能被TCP拆分为多个包进行发送,也可能把多个小包封装成一个大的数据包进行发送。
粘包的情况有几种:
- 收到一个完整的包,没有粘包
- 收到一个完整的包和下一个包的一部分
- 收到上一个包的一部分和下一个完整的包
- 收到一个包的一部分(完整的包太大,被拆分成多个包)
解决方案
常见的解决方案有几种
- 消息定长:即限制每...
Read article
「 QT 」
January 15, 2020
Words count
1k
Reading time
1 mins.
前言
在上一篇文章中,主要介绍了命名管道的使用。除了命名管道外,其实TCP/IP也是进程间通信的常用技术。在qt中,主要是使用QTcpServer和QTcpSocket来实现的。
步骤
大致的步骤跟命名管道是一致的,不同的是,命名管道在监听和连接时,使用a specified key,而tcp/ip需要指定ip地址和port端口
具体代码
1 2 3 4 5
| // 1. 服务端 listen(const QHostAddress &address = QHostAddress::Any, quint16 ... |
Read article
「 QT 」
January 15, 2020
Words count
4.7k
Reading time
4 mins.
前言
现在在逐步将项目中的功能块,这样子可以针对不同用户需求,灵活启用或卸载部分功能。目前,我们采用的方案是将功能打包成独立的exe,在启用时通过进程间通信进行交互。这里就涉及到进程间通信的技术,常用的技术有几种:
- TCP/IP
- 共享内存
- QProcess
- 命名管道
这里主要介绍命名管道的使用
步骤
QLocalServer(服务端)
- 创建QLocalServer
- 调用server的listen(“a specified key”)函数进行监听新的连接
- 接收server发送的newConnection...
Read article
「 QT 」
January 15, 2020
Words count
3.5k
Reading time
3 mins.
前言
给控件设置样式的方式常用的有两种:
- 在 QT Designer 中,选中需要设置样式的控件,右键–>改变样式表,即可以给控件设置样式
- 另外一种是在代码中动态设置,调用控件的setStyleSheet函数,为控件设置样式
这两种方式都是针对单个控件的,假如需要对整个应用进行换肤呢?这时候可以使用.qss为后缀的文件进行统一设置
步骤
- 创建.qss文件
- 将需要实现换肤功能的控件的样式配置全部写在该文件中
- 在main函数中,调用QApplication的setStyleSheet函数,即可...
Read article
「 QT 」
January 15, 2020
Words count
5.8k
Reading time
5 mins.
前言
在项目中,遇到一个需求:需要动态监测U盘插入,自动读取U盘文件并打开。为了实现这个功能,我们可以使用RegisterDeviceNotification注册设备事件的通知,
然后在程序中处理WM_DEVICECHANGE消息来实现
步骤
- RegisterDeviceNotification注册设备事件的通知
- 在QWidget中重新实现它的nativeEvent函数来接收处理WM_DEVICECHANGE消息
具体代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24... |
Read article