QT March 26, 2020

【QT】qt5.9解析和构建Json字符串

Words count 5.1k Reading time 5 mins.

前言

QT5开始新增加几个相关类,专门用于处理JSON:

  1. QJsonDocument:provides a way to read and write JSON documents,用于读写json格...
Read article

QT March 18, 2020

【QT】使用vld进行内存泄漏检测

Words count 684 Reading time 1 mins.

前言

通过官网,我们可以了解到Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具,它有几个优点:

  1. 为每个泄漏的块提供完整的堆栈跟踪,包括可用的源文件和行号信息。
  2. 检测大多数(如果不是全部)进程内内存泄漏类型,包括基于COM的泄漏和基于Win32 / Win64堆的纯泄漏
  3. 所选模块(DLL或什至是主EXE)可以从泄漏检测中排除
  4. 提供泄漏块的完整数据转储(十六进制和ASCII)
  5. 可定制的内存泄漏报告:可以保存到文件或发送到调试器,并且可以包含可变...
Read article

QT January 16, 2020

【QT】多线程 -- 实现多线程的几种方式

Words count 7.7k Reading time 7 mins.

前言

假如将一些耗时操作放在UI线程处理,会导致UI卡顿,影响用户使用体验。因此,我们通常会将耗时操作放在新的线程中处理。这就涉及到线程的使用。在qt中,有几种方式启动多线程:

  1. 继承QThread,重新实现run()函数
  2. 使用QObject::moveToThread()函数
  3. 使用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

【QT】进程间通信 -- 使用命名管道实现qt应用程序只运行一个实例

Words count 4.5k Reading time 4 mins.

前言

在项目中,会遇到这么一个需求,应用程序只能存在一个运行实例。关于这需求,网上流行几种实现方式:

  1. 通过QSharedMemory实现
  2. 使用官方提供的QTSingleApplication
  3. 使用QLocalServer和QLocalSocket

本文章主要介绍第三种方式

实现思路

  1. 继承QApplicaiton或者QCoreApplication自定义一个SingleApplication
  2. 在SingleApplication构造函数中创建一个QLocalSocket连接指定server_name...
Read article

QT January 15, 2020

【QT】进程间通信 -- 字节数组与int之间的转换

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

【QT】进程间通信 -- 粘包,拆包

Words count 652 Reading time 1 mins.

前言

不管是走命名管道还是TCP/IP的方式,都会有粘包的问题发生。粘包的产生的原因可以这么理解:客户端与服务器维持一个长连接,在连接不断开的情况下,可以持续不断地进行数据的交互。一个完整的包可能被TCP拆分为多个包进行发送,也可能把多个小包封装成一个大的数据包进行发送。

粘包的情况有几种:

  1. 收到一个完整的包,没有粘包
  2. 收到一个完整的包和下一个包的一部分
  3. 收到上一个包的一部分和下一个完整的包
  4. 收到一个包的一部分(完整的包太大,被拆分成多个包)

解决方案

常见的解决方案有几种

  1. 消息定长:即限制每...
Read article

QT January 15, 2020

【QT】进程间通信 -- TCP/IP

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

【QT】进程间通信 -- QLocalServer/QLocalSocket(命名管道)

Words count 4.7k Reading time 4 mins.

前言

现在在逐步将项目中的功能块,这样子可以针对不同用户需求,灵活启用或卸载部分功能。目前,我们采用的方案是将功能打包成独立的exe,在启用时通过进程间通信进行交互。这里就涉及到进程间通信的技术,常用的技术有几种:

  1. TCP/IP
  2. 共享内存
  3. QProcess
  4. 命名管道
    这里主要介绍命名管道的使用

步骤

QLocalServer(服务端)

  1. 创建QLocalServer
  2. 调用server的listen(“a specified key”)函数进行监听新的连接
  3. 接收server发送的newConnection...
Read article

QT January 15, 2020

【QT】全局换肤

Words count 3.5k Reading time 3 mins.

前言

给控件设置样式的方式常用的有两种:

  1. 在 QT Designer 中,选中需要设置样式的控件,右键–>改变样式表,即可以给控件设置样式
  2. 另外一种是在代码中动态设置,调用控件的setStyleSheet函数,为控件设置样式
    这两种方式都是针对单个控件的,假如需要对整个应用进行换肤呢?这时候可以使用.qss为后缀的文件进行统一设置

步骤

  1. 创建.qss文件
  2. 将需要实现换肤功能的控件的样式配置全部写在该文件中
  3. 在main函数中,调用QApplication的setStyleSheet函数,即可...
Read article

QT January 15, 2020

【QT】动态监测U盘插拔

Words count 5.8k Reading time 5 mins.

前言

在项目中,遇到一个需求:需要动态监测U盘插入,自动读取U盘文件并打开。为了实现这个功能,我们可以使用RegisterDeviceNotification注册设备事件的通知,
然后在程序中处理WM_DEVICECHANGE消息来实现

步骤

  1. RegisterDeviceNotification注册设备事件的通知
  2. 在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
Load more
0%