QML 网络+串口 调试工具

0 阅读2分钟

最近在学习QML的相关知识点,然后利用所学知识,开发了一款调试工具,可以进行TCP和UDP和串口三方面的调试;

此篇博客主要介绍工具的使用和代码架构,源码已开源,链接在文末。


1.工具截图

TCP客户端 在这里插入图片描述 TCP服务器 在这里插入图片描述 UDP客户端 在这里插入图片描述 串口调试 在这里插入图片描述 侧边栏菜单 在这里插入图片描述 弹窗 在这里插入图片描述 接收保存到文件:

在这里插入图片描述

功能其实都是参考NetAssist的;然后ui是参考网上的一篇博客的,现在找不到那边博客了,链接就没放出来。

其中,TCP客户端和TCP服务端可以自己和自己进行链接通讯测试,UDP可以多开工具或者使用NetAssist工具进行测试;

串口测试,我使用的是虚拟串口软件Virtual Serial Port Driver,启动两个调试工具软件,打开两个虚拟出来的串口号,即可进行相互传输数据;

在这里插入图片描述 在这里插入图片描述


2.系统架构

工具前端ui采用QML语言编写,后端数据处理则使用QT语言,这种前后端分离适应当前环境的技术架构。

大概结构如下:(左边是QT,右边是QML) 在这里插入图片描述 QT端,每一种调试都会有一组类在处理,相应对应这QML端的qml文件;

最重要的是 engine.addImportPath("qrc:/Resource/qml"); 将所有qml文件加载起来;

QT 和 QML 是如何通讯的? 在 void QmlManager::init() 函数中,使用了qmlRegisterSingletonType函数将SocketControllerC++类对象注册为 QML 中的全局唯一单例对象‌,使多个 QML 组件可共享同一实例;

qmlRegisterSingletonType<SocketController>("Nettools", 1, 0, "SocketController", SingletonSocketController);

在SocketController类中,声明了四个类对象,该四个类对象即可被qml调用;

Q_PROPERTY(TcpClient *tcpClient READ tcpClient NOTIFY signalTcpClient)
Q_PROPERTY(TcpServer *tcpServer READ tcpServer NOTIFY signalTcpServer)
Q_PROPERTY(UdpClient *udpClient READ udpClient NOTIFY signalUdpClient)
Q_PROPERTY(SerialPort *serialPort READ serialPort NOTIFY signalSerialPort)

紧接着在qml中,只要导入了该模块都可以使用这个对象与QT进行通讯了。

import Nettools 1.0

property var  globalSocket: SocketController
property var  serialPort: globalSocket.serialPort
property var  tcpClinet: globalSocket.tcpClient
property var  tcpServer: globalSocket.tcpServer
property var  udpClient: globalSocket.udpClient

在TcpClient、TcpServer、UdpClient、SerialPort中,都继承自SocketNetworkBase,内部提供了通用的与QML通讯的声明:

Q_PROPERTY(bool _isActivate READ isActivate WRITE setIsActivate NOTIFY signalIsActivateChanged)
Q_PROPERTY(QString _serverIp READ serverIp WRITE setServerIp NOTIFY signalServerIpChanged)
Q_PROPERTY(int _port READ port WRITE setPort NOTIFY signalPortChanged)
Q_PROPERTY(QString _sendData READ sendData WRITE setSendData NOTIFY signalSendDataChanged)
Q_PROPERTY(QString _revData READ revData WRITE setRevData NOTIFY signalRevDataChanged)
Q_PROPERTY(int _sendFormat READ sendFormat WRITE setSendFormat NOTIFY signalSendFormatChanged)
Q_PROPERTY(int _recvFormat READ recvFormat WRITE setRecvFormat NOTIFY signalRecvFormatChanged)
Q_PROPERTY(bool _isSendFileState READ getIsSendFileState WRITE setIsSendFileState NOTIFY signalIsSendFileStateChanged)
Q_PROPERTY(int _sendFileProgress READ getSendFileProgress WRITE setSendFileProgress NOTIFY signalSendFileProgressChanged)

main函数中,只调用了QmlManager *qmlManager = QmlManager::Instance();一行代码,即可将qml加载; QmlManager内部已经加载初始化。

QML中使用了StackView组件用于页面切换。


3.源码

gitee.com/ygt777/qml-…

已经开源到gitee,有兴趣可以Fork参考学习!