基于Qt的软件框架设计--续
来源:互联网 发布:mac双系统卸载 编辑:程序博客网 时间:2024/05/18 03:49
接上篇,我们的软件如何实现呢?
1、通信
通信口不局限于串口,如果有多种接口可以抽象。
以下为CPort头文件:
#ifndef CPORT_H#define CPORT_H#include <QObject>#include <QSerialPort>#include <QThread>#include <QTimer>class Message;//当然这个结构得自己定义并注册,这里使用了前置申明class CPort : public QObject{ Q_OBJECTpublic: explicit CPort(QObject *parent = 0); ~CPort();signals: //向上层传送消息 void signalUpwardMsg(const Message&);private slots: //上层传过来的消息发送到串口 void onDownwardMsg(const Message&); //读串口数据 void onReadData(); //在这里定时的解析收到的数据 void onParse();private: QSerialPort *port; QThread worker; QTimer *timer; QByteArray data;};#endif // CPORT_H
以下是CPort的源文件:
#include "CPort.h"#include "message.h"#include <QDebug>CPort::CPort(QObject *parent) : QObject(parent){ port = new QSerialPort(this); #ifdef __arm__ port->setPortName("/dev/ttymxc1"); #else port->setPortName("COM2"); #endif port->setBaudRate(QSerialPort::Baud115200); port->setDataBits(QSerialPort::Data8); port->setParity(QSerialPort::EvenParity); port->setStopBits(QSerialPort::OneStop); connect(port,SIGNAL(readyRead()),this,SLOT(onReadData())); if(!port->open(QIODevice::ReadWrite)) { qDebug()<<"Port Can't open"; } timer = new QTimer(this); timer->setInterval(10000); connect(timer,SIGNAL(timeout()),SLOT(onParse())); timer->start(); this->moveToThread(&worker); worker.start(QThread::HighPriority);}CPort::~CPort(){}void CPort::onDownwardMsg(const Message & msg){ QByteArray array(msg.content); port->write(array);}void CPort::onReadData(){ data.append(port->readAll());}void CPort::onParse(){ for(int i = 0 ; i < data.size();i++) { //协议解析后得到 message } Message msg; signalUpwardMsg(msg);}
2、业务逻辑
业务逻辑就因项目而异了
#ifndef CMSGBUSINESS_H#define CMSGBUSINESS_H#include <QObject>class Message;class CMsgBusiness : public QObject{ Q_OBJECTpublic: explicit CMsgBusiness(QObject *parent = 0); ~CMsgBusiness();public: //这里可以在UI里来直接调用 QString get()const;signals: //处理完的Msg发到界面上去显示 void signalSomethingComing(QString);private slots: //收到下层来的msg void onCommingMsg(const Message&);};#endif // CMSGBUSINESS_H
#include "CMsgBusiness.h"CMsgBusiness::CMsgBusiness(QObject *parent) : QObject(parent){}CMsgBusiness::~CMsgBusiness(){}void CMsgBusiness::onCommingMsg(const Message &msg){ Q_UNUSED(msg) //这里可以对收到的msg进行处理 signalSomethingComing(QString("sss"));}
3 bridge
这个类是一个承上启下的使用类
#ifndef CBRIDGE_H#define CBRIDGE_H#include <QObject>class CMsgBusiness;class CPort;class CBridge : public QObject{ Q_OBJECTpublic: explicit CBridge(QObject *parent = 0); ~CBridge(); //这里可以得到所有的实例 CMsgBusiness *business()const; CPort *port()const;signals: //这里可以转发信号public slots:private: CMsgBusiness *pBusiness; CPort *pPort;};#endif // CBRIDGE_H
#include "CBridge.h"#include "CPort.h"#include "CMsgBusiness.h"CBridge::CBridge(QObject *parent) : QObject(parent){ pBusiness = new CMsgBusiness(this); pPort = new CPort();//这里的实例化得注意了 //通信层与业务层的通信 connect(pPort,SIGNAL(signalUpwardMsg(Message)) ,pBusiness,SLOT(onCommingMsg(Message)));}CBridge::~CBridge(){}CMsgBusiness *CBridge::business() const{ return pBusiness;}CPort *CBridge::port() const{ return pPort;}
主界面
#include "mainwindow.h"#include "CBridge.h"#include "CMsgBusiness.h"MainWindow::MainWindow(QWidget *parent,CBridge* bridge) : QMainWindow(parent) ,pb(bridge){ //这里完成业务层与UI层的通信 connect(pb->business(),SIGNAL(signalSomethingComing(QString)) ,SLOT(onComing(QString)));}MainWindow::~MainWindow(){}void MainWindow::onComing(QString content){ Q_UNUSED(content) //SHOW ON UI}
客户端
#include "mainwindow.h"#include <QApplication>#include "CBridge.h"int main(int argc, char *argv[]){ QApplication a(argc, argv); MainWindow w(0,new CBridge); w.show(); return a.exec();}
以上是我在项目使用的架构,其实架构没有最好的,只有最合适的。
阅读全文
0 0
- 基于Qt的软件框架设计--续
- 基于Qt的软件框架设计
- Netra基于Rdk平台的软件框架设计
- Netra基于Rdk平台的软件框架设计
- Netra基于Rdk平台的软件框架设计
- Netra(DM8168)基于Rdk平台的软件框架设计
- Netra基于Rdk平台的软件框架设计
- Netra基于Rdk平台的软件框架设计
- Netra基于Rdk平台的软件框架设计
- Netra(DM8168)基于Rdk平台的软件框架设计
- Netra基于Rdk平台的软件框架设计
- Netra基于Rdk平台的软件框架设计
- 【Qt编程】基于Qt的词典开发系列<一>--词典框架设计及成品展示
- 软件框架设计的艺术
- 《软件框架设计的艺术》
- 基于Qt的GPS导航系统软件源代码
- 基于Qt Assistant的软件帮助系统
- 基于Qt的局域网聊天软件
- Spring声明式事务配置管理方法
- JS中匹配正整数
- KMP算法
- HTTP要点概述:九,HTTP获取部分内容的请求范围
- 【题解】 数学一本通 例1.2-1 指数取余
- 基于Qt的软件框架设计--续
- 数据压缩实验六:MPG音频编码
- ThinkPHP DB_FIELDS_CACHE 启用字段缓存跨库访问BUG
- TypeScript Symbols和迭代器
- MAVEN学习 (1):创建MAVEN项目并且理解基本的原理
- Java中文编程开发,让Java编写更加容易
- 纪实
- 高性能定时器
- Android SVG图像颜色设置无效的原因及解决