1、引子
Qt,在很多人的认识里是一个做界面的框架,只用来做界面,而后端往往是用别的来实现。在本人的实践中, 我把界面与后端的实现都用Qt来实现了。
2、软件分层
一般来说,我们的软件架构会很成很多层,这里我们分三层就够 了,分层如下图所示:
2.1 GUI层
这里我们由于基于Qt的,所以这一层都是用Qt的类库来实现了,所有的主界面都会从这三个类:QWiget,QMainWindow,QDialog中的一个继承而来,并在main函数里生成实例并show出来,进入主消息循环。我本人习惯于使用QWiget,不使用UI文件,所有的界面都new出来,再使用代码来布局。
2.2 Models层
model层主要实现我们的软件的业务逻辑,这里的模块因整个软件的业务逻辑来合理划分模块,达到高内聚松耦合的效果。在这里我们就涉及到一个这些业务逻辑类,在那里new出来的问题了。我的做法是:做一个bridge类,让所有的业务逻辑类都在这个bridge类里实例化。
2.3 Communication 层
这一层的话就是实现对数据的采集了,通信 的方式 有多种多样,有串口,有网口,有CAN口等。这一层收到的数据向models层发,用户的输入也通过这一层向执行机构发。
那么这一层的类,在那里实例化呢?我同样选择在bridge类里,这样,bridge类其实是一个什么业务功能都没有的类,只是提供了各个类之间可以相互connect(信号槽)的载体。
【QT|基于Qt软件框架设计】3、 下层与GUI层的沟通
至此,我们的除GUI层的类(通信与模块)都在bridge类里能通过信号槽的机制沟通起来了。那么我们的的模型怎么和GUI进行通信呢?
我们可以通过这个bridge类来进行,因为我们的其它 的类都是在bridge类里进行实例化的,所以这个类里可以拥有类的引用,我们可以在QWidget里的构造函数里传一个bridge类的指针进去,这样,我们的所有类,都可以和GUI进行通信了。
4、运行架构
当我们把所有的层次的代码都设计好了,并且知道在那个类里,那个层级来实现后,我们要使用线程让整个软件欢快的运行进来 。这就是我们要说的运行架构。
一般而言,我们把所有的communication的类都 会单独出来成为一个线程,这样,不会阻塞GUI线程,也能够更快的响应采集信息和向下位机传递控制信息。
所以communication这一层,一般有几个端口就会有几个线程。当然有些比较轻量级的可以合在一个线程里。
bridge类收到GUI线程里,为什么要这么做呢,我们界面弹出来时,要从model里get最新的值显示在界面上,(用信号槽实现也可以但是会显得比较繁琐),所以要调用get的方法,有这样的需求, 我们最好把所有的model都放到一个线程里——-即GUI线程。
这样我们的一个小型的信息采集与控制系统的主框架就搭建好了。
最后强调一点的是:当使用线程时建议使用movetothread的方法。如果不使用这个方法的话,所有的实例都必须在线程的run()函数里new出来,才能保证这个类的槽函数在这个线程的消息循环里执行。
---------------------
作者:amwha
来源:CSDN
原文:https://blog.csdn.net/amwha/article/details/73928281
版权声明:本文为博主原创文章,转载请附上博文链接!
推荐阅读
- 5.14.2 Qt+VS 2017 环境配置
- Qt|Qt获取机器当前日期-时间
- 项目实战|[笔记]Qt5+FFMpeg+Opencv 实现实时美颜直播推流《一》基础知识以及直播服务器配置
- Windows|windows qt 使用gsoap访问 WSDL 网络接口,以天气预报网站为示例
- Linux|Ubuntu使用集成开发方式编译C++程序—笔记2
- QT|QtCreator按顺序编译多个子项目
- Qt|QComboBox文字居中的几种实现方式
- QT笔记|Qt实现最小化窗口到托盘图标
- QT|QT利用 QFile, QTextStream写入、读取文件时的换行问题