Qt展示动态波形
- 需求描述
- 成品展示
- 实现难点
- Qt多线程
需求描述
- 接入串口,配置串口顺序进行接收数据;
- 数据分成两个串口分别传入,使用多线程并发接入;
- 时域数据有两个通道(I,Q),分别以实时波形展示;
- 频域数据有三个通道(I,Q,C),C表示联合通道,分别展示FFT波形;
- 状态数据列表实时展示;
- 时域可以配置时间窗口大小,也就是展示的波形最大时间段;
- 频域可以配置频域段;
- 数据支持随时保存,并可以打开查看;
成品展示
实现难点
Qt多线程
Qt实现多线程,有两种方式:
- 一种是使用
QThread
: - 定义个类,继承
QThread
; - 然后重写类的
run()
方法; - 在主线程中通过类对象的
start()
方法启动线程; - 一种是使用自定义类(任务类),继承
QObject
: - 在任务类中定义公共任务方法,实现具体的任务处理逻辑;
- 在主线程中创建
QThread
对象(千万不要给创建对象指定父对象); - 通过调用
QObject
类提供的moveToThread
方法,将任务类对象移动到创建的子线程对象QThread
中; - 调用子线程对象的
start()
方法,子线程开始启动,但是移动到子线程中的对象并没有工作; - 通过调用自定义类对象的工作函数,让这个函数开始执行,这时候就是在移动到的子线程中执行的。
两种方式的区别:
- 第一种由于
run()
方法不可以带参数,所以如果要传参数,需要把参数作为成员变量,通过信号槽机制进行传递;第二种没有这种限制,在任务类中定义的任务函数可以带有参数,所以更加灵活;