最近在学习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,有兴趣可以Fork参考学习!