一、编译环境
1、apt install qt4-default
2、每次 "qmake -project" 后都要在 【xxx.pro】 文件尾部加入 "QT += network"
3、 【xxx.pro】 文件内去掉对rapijson文件的编译
4、不要用Qt5,需要大量修改
二、基础框架目录结构
============= 主目录结构 ====================
【xxxx_workspace】(主工作空间)
|
+-- 【xxxx】 (需要编译的代码都在里面)
| |
| +-- 【source】 (源码目录)
| | |-- main.cpp 及各类h,cpp文件
| |
| +-- 【build】 (编译目录)
| |-- 编译过程文件(.o),及可执行文件
|
+-- 【include】 (不能用于编译的第三方代码,如rapidjson)
|
+-- readme.txt (说明文档)
============================================
【xxxx】内结构
1、main.cpp为桌面程序的入口,调用MyMainFrame来启动程序,不用修改
2、frame目录
MyMainFrame: 最基本的根视图类
BackStageThread: 后台线程
Constant: 各种CSS,远程服务器地址,全局变量和常量
3、page目录
MyMainFrame内切换的各个页面
4、dialog目录
一般用于弹窗,其父视窗为MyMainFrame内的mainLayout
5、libs
各种辅助类,重要的如下:
1、CzAlert:提示框用到的
2、CzKeyboard:屏幕键盘
3、CzQtEmbeded:添加各种控件,网络信息及设置,http请求,重启等常用操作
4、CzTcpServer:Tcp服务器
5、CzTcpServerThread:CzTcpServer的子线程,不会单独拿出来用
6、QRoundProgressBar.cpp:chart控件
6、image目录
图片,调用时路径:(QString)ROOT_PATH+"image/main_bg.jpg"
7、user目录
用于修改顶部栏(TopBar),底部栏(BottomBar),各页面的管理(PageManager)
三、基础框架所含功能
1、启动界面生成一个根视图
2、生成全局九宫格的尺寸,只需调整以下内容(Constant.cpp/【界面参数调整】 区)
Constant内的全局变量即可:topHeightRate,bottomHeightRate,leftWidthRate,rightWidthRate
define FONT_SIZE_DEFAULT 基础文字大小,便于统一修改
2、顶部栏显示(TopBar)
时间,
有线网卡MAC 地址(Constant::enthMACID)
联网网络状态(用ping baidu来判断)
一个重新启程程序的按钮
3、中部生成一个容器 (由user/PageManager内的各个Page实例来填充)
4、底部栏容器 (BottomBar,导航栏)
5、启动后台线程(BackStageThread)连接TCP服务器,
并在onTcpClientXXXX的slot中处理连接状态及接收讯息,
后台线程每10秒会上报一次网络状态
6、所有的其他类的回调信息slot都在 MyMainFrqme::onDebugMsg()内
7、前台有个1秒定时器,可供操作在MyMainFrame::oneSecondTimerUpdate()
8、切换中间页面只需调用
MyMainFrame::getInstance()->replacePage(QFrame * newPage)
页面都继承自QFrame
9、点及左上角时间可拉开debugPad弹层,可在Constant.cpp钟设置useDebug来开关
实现位置在 MyMainFrame::toggleDebug
四、创建新项目需做的准备
1、复制项目
2、清空page,dialog目录,或留几个范例文件
3、修改 Constant.h 的 TCP 服务器信息,如果没有就设成如下,程序会自动判断,不去链接
#define TCP_SERVER_IP ""
#define TCP_SERVER_PORT 0
4、修改 Constant.cpp 的 界面参数调整 区
5、Constant.cpp 设置是否启用debug(点击事件)
6、修改user下的界面文件,尤其是PageManager,每加入一个page,必须listPage << pageXXX
五、长连接协议
客户端每秒发送一次心跳,每10次发送一个mac,服务端响应"1",
服务端收到后判断长度为12则保存至线程的mac变量里,否则丢弃,
当服务端主动发送时,客户端收到的信息处理:
1、判断与上次接收的时间间隔,小于10ms,且内容相同,丢弃
2、去掉第一个字符,并判第二个是不是"{",然后解析json
六、坑
1、单例的写法在根视图一定要在实例化后,再用该实例去init后,然后才能往后走,
因为在实例化时,其他类调用到根视图的getInstance()时会找不到,导致各种怪异
参见 MyMainFrame
2、如要显示鼠标,则设置Constance内的 #define SHOW_MOUSE true,否则为false
七、项目中新建一个类的操作
1、Constant.h中加入
class 类名
2、类必须#include "../frame/Constant.h"
3、【项目根目录】/xxx.pro中
HEADERS += 。。。。\
类名.h
SOURCES += 。。。。\
类名.cpp
4、进入 build,运行指令
qmake ..