32 KiB
QtUI 韩国 喷码机项目架构说明文档
版本: V6.7.5
目标平台: ARM Linux (全志H618) / x86 (模拟调试)
Qt 版本: Qt 5.x (ARM) / Qt 5.x (x86)
屏幕分辨率: 800x600
文档最后更新日期: 2026-07-23
目录
1. 项目概述
本项目是一个工业喷码机(CIJ,Continuous Ink Jet)的上位机控制系统,运行在嵌入式ARM Linux平台上。软件通过串口与FPGA和STM32两块下位机硬件通信,实现喷码内容的编辑、预览、打印控制、设备状态监控、系统参数管理等功能。
核心功能
- 喷码内容编辑: 支持文本、日期、计数器、图片、条形码(一维码)、二维码(QR/DataMatrix)等图元
- 打印控制: 支持时延触发、电眼触发、同步器触发、电眼+同步器等多种触发模式
- 设备管理: 墨路控制(阀门、泵、加热器)、粘度检测、相位检测、高压控制
- 系统管理: 参数配置、FPGA/STM32固件升级、软件更新、日志管理
- 文件管理: 作业文件的创建、保存、导入、导出(U盘)
- RFID刷卡: 墨水/溶剂/保养卡的身份验证与消耗管理
2. 技术栈
| 类别 | 技术 |
|---|---|
| 框架 | Qt 5.x (ARM) / Qt 5.x (x86) |
| 语言 | C++ (C++11),部分C |
| 构建工具 | qmake |
| UI设计 | Qt Designer (.ui文件) |
| 序列化 | XML (作业文件) |
| 通信 | QSerialPort (RS232/RS485) |
| 网络 | Qt Network (WiFi) |
| 条码生成 | C语言库 (BarCode目录) |
| 二维码生成 | C语言库 (QtQREnCode目录) |
| DataMatrix | C++库 (Matrix目录) |
| Modbus | 开源FreeModbus库 |
| 加密 | SM3/SM4 国密算法 |
| 日志 | 自定义Logger框架 |
3. 整体架构
项目采用分层架构,自上而下分为:
┌─────────────────────────────────────────────────────────┐
│ UI 表现层 │
│ InkJetPrinter (主窗口) + MainWidget (打印主界面) │
│ 各功能页面: SystemManage, SystemSetting, LogInfo, ... │
│ 场景编辑器: TestPrintWidget, PicScene │
├─────────────────────────────────────────────────────────┤
│ 业务逻辑层 │
│ SysPara (系统参数管理) │
│ DevOp (设备操作) │
│ RunTimeCtrl (运行时间统计) │
│ RFIDManager (刷卡管理) │
├─────────────────────────────────────────────────────────┤
│ 通信层 │
│ Serial (串口通信封装) │
│ Modbus (Modbus协议) │
├─────────────────────────────────────────────────────────┤
│ 硬件抽象层 │
│ FPGA (喷印控制、充电电压、相位检测) │
│ STM32 (墨路控制、传感器采集) │
│ RFID读卡器 (IC卡读写) │
└─────────────────────────────────────────────────────────┘
模块依赖关系图
InkJetPrinter (顶层窗口)
├── MainWidget (打印主界面)
│ ├── generatePrintContent (打印文件载入预览)
│ ├── FileManageWidget (文件管理)
│ ├── PrintTextDisplay (打印预览)
| └── 其他
├── TestPrintWidget (编辑界面)
│ ├── PicScene (场景内容容器)
│ ├── ItemEditor (文本图元编辑)
│ ├── ImageLoader (图片图元加载)
│ ├── BarcodeEditor (条码图元编辑)
| ├── DateVarSet (日期变量设置)
│ ├── CounterVarSet (计数器图元设置)
| └── ScheduleShiftsEditor (班次编辑)
├── SystemManage (系统管理)
├── SystemSetting (系统设置)
├── SystemUpdate (系统升级)
├── PrintSetting (打印设置)
├── MainInstruction (主指令)
├── LogInfo (日志信息)
├── OtherInfo (其他信息)
└── DialogFileOperation (打印文件选择操作)
SysPara (系统参数,贯穿所有模块)
Serial (串口通信,连接FPGA和STM32)
RFIDManager (RFID刷卡管理)
RunTimeCtrl (运行时间控制)
4. 目录结构
项目根目录/
├── QtUI.pro # 项目文件 (qmake)
├── main.cpp # 程序入口
├── mainwidget.h/cpp # 打印主界面 (MainWidget)
├── InkJetPrinter.h/cpp # 顶层主窗口
├── Public.h/cpp # 公共工具类
├── SysPara.h/cpp # 系统参数管理 (核心)
├── DevOp.h/cpp # 设备操作 (FPGA寄存器读写)
├── myinclude.h # 全局宏定义、枚举
├── VerBVersion.h # 版本号定义
├── dump.h/cpp # 崩溃信号处理
├── runtimectrl.h/cpp # 运行时间统计
│
├── scene/ # 场景(喷码内容)编辑系统
│ ├── picscene.h/cpp # 场景类 (QGraphicsScene)
│ ├── myview.h/cpp # 视图类 (QGraphicsView)
│ ├── PicSceneLoader.h/cpp # 场景XML加载/保存
│ ├── pictextitem.h/cpp # 文本图元
│ ├── PicDateItem.h/cpp # 日期图元
│ ├── PicImageItem.h/cpp # 图片图元
│ ├── PicCounterItem.h/cpp # 计数器图元
│ ├── PicScheduleShiftItem.h/cpp # 班次图元
│ ├── piccodeitem.h/cpp # 条码/二维码图元
│ ├── ViewModels.h/cpp # 视图模型 (数据结构)
│ ├── ItemCommon.h/cpp # 图元工具函数
│ ├── ItemGeneralSettings.* # 图元通用设置
│ ├── BarcodeEditor.* # 条码编辑器
│ ├── CounterEditor.* # 计数器编辑器
│ ├── DateFormatEditor.* # 日期格式编辑器
│ ├── DateReplaceEditor.* # 日期替换编辑器
│ ├── ScheduleShiftsEditor.* # 班次编辑器
│ ├── DlgBarcodeFormat.* # 条码格式对话框
│ └── DlgQrcodeFormat.* # 二维码格式对话框
│
├── rfid/ # RFID刷卡模块
│ ├── rfidmanager.h/cpp # 刷卡管理核心
│ ├── rfidfunction.h/cpp # 刷卡功能函数
│ ├── sm3.h/cpp # SM3 国密哈希
│ └── sm4.h/cpp # SM4 国密加密
│
├── Serial/ # 串口通信封装
│ └── serial.h/cpp # 串口封装 (FPGA/STM32双通道)
│
├── fileManage/ # 文件管理
│ ├── FileManageWidget.* # 文件管理界面
│ └── UDiskComboBox.* # U盘检测与文件列表
│
├── modbus/ # Modbus协议
│ ├── modbus/ # FreeModbus库
│ ├── port/ # 移植层
│ ├── modbusserial.* # Modbus串口
│ └── modbustcp.* # Modbus TCP
│
├── Log/ # 日志框架
│ ├── logger.h/cpp # 日志基类
│ ├── filelogger.h/cpp # 文件日志
│ ├── logmessage.h/cpp # 日志消息
│ └── logglobal.h # 日志全局宏
│
├── BarCode/ # 一维条码生成库 (C)
│ ├── barcode.h # 条码头文件
│ ├── code128.c/code39.c/ # 各类型条码实现
│ └── ...
│
├── QtQREnCode/ # 二维码生成库 (C)
│ ├── qrencode.h/c # QR码生成
│ └── ...
│
├── Matrix/ # DataMatrix码生成库 (C++)
│ ├── dm200.cpp # DataMatrix实现
│ └── ...
│
├── image.qrc # Qt资源文件
├── *.ts # 多语言翻译文件
│
├── 0/ ~ 101/ # 字库图片资源 (计数器图元 数字占位图)
│ └── image/
│ └── digitalWidth*.bmp
│
└── conf/ # 运行时配置目录 (部署后)
├── sysPara.bin # 系统参数二进制文件
├── config.ini # 日志配置
└── ...
5. 核心模块详解
5.1 程序入口 (main.cpp)
程序启动流程:
- 读取键盘类型配置(多语言键盘/普通键盘)
- 创建 QApplication,配置日志系统 (FileLogger)
- 加载字体和应用级样式
- 根据语言配置加载对应翻译文件 (.qm)
- 创建 MyInputMethod(自定义输入法)
- 创建 InkJetPrinter 主窗口并显示
5.2 主窗口 (InkJetPrinter)
InkJetPrinter.h | InkJetPrinter.cpp
职责: 顶层窗口,管理所有子页面和核心业务流程。
关键成员:
m_StackedWidget- 页面容器,通过索引切换不同功能页面m_MainWidget- 打印主界面(首页)m_TestPrintWidget- 编辑界面serialFPGA/serialSTM32- 两个独立串口线程,分别与FPGA和STM32通信ctrl_runTime- 运行时间控制器manager_rfid- RFID刷卡管理器
核心定时器:
m_Timer- 主定时器 (10ms),处理设备状态轮询、自动控制viscosity_timer- 粘度检测定时器 (1s)
设备自动控制:
autoControlValvePump()- 阀门/泵自动控制pressureAdj()- 压力自动调节(PID算法)autoControlHeater()- 加热器自动控制detectAndcontrolReclaimTank()- 回收槽检测与控制
5.3 打印主界面 (MainWidget)
职责: 打印操作的主界面,包含打印预览、打印控制、文件管理。
关键功能:
generatePrintContent()- 将场景渲染为打印数据并写入缓冲区待发送至FPGAonPreviewScene- 场景数据转为FPGA点阵数据,解析场景内容生成计数器字模及其它控制信息variableItemsUpdate()- 更新动态图元(日期、轮班、条形码/二维码等)并写入缓冲区SendPrintDataToFpga()- 通过串口向FPGA发送打印内容数据
页面切换:
- 通过底部导航按钮(编辑、新增、主界面、管理、消息)切换子页面
- 使用信号槽
sendButtonClickedSignal(int)通知 InkJetPrinter 切换页面
5.4 系统参数管理 (SysPara)
职责: 管理所有系统参数,是系统的数据中枢。所有模块通过 SysPara 读写参数。
核心数据结构:
calandar_and_dat_t- 日历/计数器数据(发送给FPGA)sysPara_t- 系统参数设定sysStatus_t- 系统状态结构体vars_t- 变量类型参数设定stepPrint_t- 分段打印设定alterPrint_t- 交替打印设定Cnt1ByGroup_t- 分段计米设定PrintSettingModel- 打印设置模型(跟随作业文件保存)voltePara_t- 旧的 FPGA 墨点充电参数集结构体,用于 67 版本 FPGAvoltePara_t_25Dots- 目前常用的 72 版本 FPGA 所对应的墨点充电数据集结构voltePara_t_No73- 96K 40um 喷嘴专用的FPGA墨点充电数据集结构体,专用于73版本(F8.2.1)
参数持久化:
- 二进制文件:
PARA_ROOT_DIR/sysPara.bin- 对于系统参数的直接二进制保存 - XML文件:
PARA_ROOT_DIR/defPrintSet.xml- 默认打印设置保存,新建文件时使用此配置,此配置也可通过MainInstruction 打开默认打印设置的设置窗口(实际是复用PrintSetting窗口)。
5.5 设备操作 (DevOp)
职责: 封装FPGA寄存器的读写操作,提供设备控制的高层接口。
关键操作:
- 阀门控制:
controlInkValve(),controlMixValve(),controlReleaseValve() - 泵控制:
WriteMoterPump() - 电压控制: DAC表读写 (
DAC_TABLE_ADDR,MATCH_*_DAC_TABLE_ADDR) - 打印控制: 启停、回收槽开关、故障恢复
- 计数器读写: 产品计数、同步计数
FPGA地址空间: 通信地址与定义位于连续墨点喷码机通信协议
5.6 串口通信 (Serial)
Serial/serial.h | Serial/serial.cpp
职责: 封装与FPGA和STM32的串口通信。
设计特点:
- 支持双通道(FPGA和STM32各自独立串口)
- 使用消息队列管理发送数据
- CRC16校验保证数据完整性
- 支持STM32固件升级(IAP协议)
- 运行在独立QThread中,不阻塞UI
通信协议:
- 自定义帧格式:命令 + 地址 + 数据 + CRC16
- 发送队列:
queueFPGA/queue - 接收解析: 通过信号槽分发到上层(
receivedFromFPGA/receivedFromSTM32)
5.7 日志系统 (Log)
5.7.1 基于LogInfo的用户日志系统
主要类:
LogInfo- 用户日志的核心类,提供日志记录、显示和保存功能,跟踪用户操作和系统事件。
5.7.2 基于QDebug的日志系统
职责: 提供程序运行时的日志记录功能,用于开发调试和问题排查。
类层次:
Logger- 日志基类,定义日志格式、级别过滤FileLogger- 文件日志实现,支持缓冲区批量写入LogMessage- 日志消息封装
使用方式:
qInfo() << "message"; // 信息日志
qWarning() << "warning"; // 警告日志
qCritical() << "error"; // 错误日志
5.8 运行时间统计 (RunTimeCtrl)
职责: 统计软件运行时长,用于设备保养提醒。
功能:
getElapsedSeconds()- 获取本次运行时间getTotalSeconds()- 获取总运行时间sig_alertTimeout()- 保养提醒信号sig_updateTimeoutDay()- 维护到期提醒
6. 场景与打印渲染系统
6.1 架构概述
场景系统基于 Qt Graphics View 框架,用于编辑和预览喷码内容。
PicScene (QGraphicsScene) # 场景,管理所有图元
├── 图元基类
│ ├── PicTextItem # 普通文本
│ ├── PicDateItem # 日期变量 (yyyy-MM-dd HH:mm:ss...)
│ ├── PicCounterItem # 计数器 (可变数字)
│ ├── PicImageItem # 图片 (Logo)
│ ├── PicCodeItem # 条码/二维码
│ └── PicScheduleShiftItem # 班次 (班次代码替换)
│
├── 图元编辑器
│ ├── ItemEditor # 普通文本编辑器
│ ├── DateVarSet # 日期变量编辑器
│ ├── CounterCarSet # 计数器编辑器
│ ├── ImageLoader # 图片读取器
│ ├── BarcodeEditor # 条码/二维码编辑器
│ └── ScheduleShiftsEditor # 班次 (班次代码替换)编辑器
│
├── 图元模型
│ ├── ItemEditor # 普通文本编辑器
│ ├── DateVarSet # 日期变量编辑器
│ ├── CounterCarSet # 计数器编辑器
│ ├── ImageLoader # 图片读取器
│ ├── BarcodeEditor # 条码/二维码编辑器
│ └── ScheduleShiftsEditor # 班次 (班次代码替换)编辑器
6.2 作业文件格式
作业文件使用 XML 格式(根元素为 VBfiles),由 PicSceneLoader 读写。要点如下:
- 根元素:
<VBfiles Version="1.0">(保存时会写入Version属性及一个简单的 DOCTYPE)。 - 每个图元为一个
<VBfile>节点,常见子元素:<pointer_x>/<pointer_y>: 图元位置(浮点数)<Condition>: 特殊条件标志,0/1<CatchStartValue>/<CatchValue>: 与 Catch 相关的计数器起始/当前值(整数)<itemAttrs ... />: 图元属性以属性集合的形式保存(见下),PicSceneLoader通过属性解析并传给具体图元对象<html_src>: 包裹图元 HTML 表示的 CDATA(编辑器中使用的 HTML 内容)
示例(简化):
<VBfiles Version="1.0">
<VBfile>
<pointer_x>55</pointer_x>
<pointer_y>0</pointer_y>
<Condition>0</Condition>
<CatchStartValue>-1</CatchStartValue>
<CatchValue>-1</CatchValue>
<itemAttrs sourceType="1" dir="0" letterSpace="1" fontFamilay="WenQuanYi7" source="FGJ" />
<html_src><![CDATA[...item html...]]></html_src>
</VBfile>
<!-- 更多 VBfile ... -->
<!-- PrintSettings 以属性形式保存在一个空元素中 -->
<PrintSettings timeTriggerPrintMode="0" triggerInterval="90" ... />
</VBfiles>
其他细节:
itemAttrs中常见属性由各图元实现saveAttrs/setAttrs控制,通用属性包括sourceType(必有)、dir、boldMultiple、colorReversal("true"/"false")、letterSpace、fontFamilay(注意拼写)以及source(图元内容或图片路径)等。html_src使用 CDATA 保存toHtml()的内容,加载时会把 CDATA 拼接并通过setHtml()恢复。PrintSettings由PrintSettingModel::saveToXml/loadFromXml通过属性读写打印相关配置(保存时作为空元素写出属性)。PicSceneLoader在解析VBfiles时会识别PrintSettings(位置可以在文件中任意出现,保存实现默认写在所有<VBfile>之后)。- 图元类型(
sourceType)的数值映射(见scene/pictextitem.h):0=UNKNOWN1=TEXT2=IMAGE3=DATETIME4=SCHEDULE_SHIFT5=CODE(一维/二维码)6=COUNTER
该节已根据 scene/PicSceneLoader.cpp 的实际实现和 Printsetting.cpp 中的读写逻辑做了校正(包含 Condition/Catch* 字段、Version 属性、html_src CDATA、以及 PrintSettings 的属性化保存)。
6.3 关键类说明
- PicSceneLoader - 场景文件的加载/保存/预览,负责XML序列化/反序列化
- ViewModels - 定义
DateItemModel、CounterViewModel等视图模型,用于编辑器与图元之间的数据传递 - ItemCommon - 图元工具函数,如根据日期模型生成文本字符串
- 打印设置 -
PrintSettingModel与作业文件绑定,包含触发模式、字宽、同步器参数等 - TestPrintWidget - 场景编辑器,提供图元的创建、编辑、删除、预览功能
7. 数据流与通信机制
7.1 打印内容数据流
用户编辑场景 (PicScene)
├── 普通静态图元 (PicTextItem, PicImageItem, ...)
│ └─── onPreviewScene() 静态文本或图片渲染为 QImage
│ └── imageToPrintData() 转换为点阵数据
│ └── SendPrintDataToFpga() 在打印开始前一次性发送所有静态打印内容
│ └── FPGA 接收并驱动喷头喷印
│
├─── PicCounterItem 计数器图元
│ └── onPreviewScene() 构建变量控制结构体(位置、大小、类型等)
│ └── DevOp::writeFpgaVariCtrl() 发送至FPGA,由FPGA直接硬件控制
│
└─── 软解动态图元 (PicDateItem PicScheduleShiftItem PicCodeItem)
└── onPreviewScene() 与静态图元一样,进入onPreviewScene()
└── variableItemsUpdate() 动态检查图元是否发生变化,更新数据
└── SendPrintDataToFpga() 发送更新后的点阵数据至FPGA
打印内容相关的几个重要的函数: SendPrintDataToFpga() 负责将打印数据、打印设置和变量控制通过串口发送给FPGA,FPGA接收后驱动喷头进行喷印。静态图元在打印开始前一次性发送,而动态图元则在每次变化时更新打印数据。更新打印数据时,SendPrintDataToFpga不会发送打印设置和变量控制数据,只会按列为单位更新打印缓冲区的点阵数据。
imageToPrintData() 将 QImage 转换为点阵数据,该函数可将图像填充至打印缓冲区的指定位置,随后由 SendPrintDataToFpga() 发送至FPGA。动态软解图元(如日期、计数器、二维码)在每次变化时调用该函数刷新打印缓冲区。
onPreviewScene() 是场景预览的核心函数,负责将场景中的所有图元渲染为 QImage,并调用 imageToPrintData() 全量写入打印缓冲区。
variableItemsUpdate() 动态检查图元是否发生变化,配合 imageToPrintData()、SendPrintDataToFpga() 实现更新打印数据。
7.2 从文件到打印的数据流向
本节中 发送打印设置与打印内容到FPGA 的术语基本可以代指调用MainWidget::SendPrintDataToFpga函数。
区别于标准VX5,此韩国定制版中,明确了发送打印内容与打印设置到FPGA的时机与作用范围,所有发送打印内容与打印设置的动作只在MainWidget::on_m_StartBtn_clicked()中进行,除此之外其它时机发送打印内容与设置的行为继承自标准VX5,实际在韩国定制版中属于冗余设计。
QtUI 按工作文件为单位对喷码内容进行管理,工作文件使用 XML 格式保存场景内容和打印设置。用户在编辑界面(TestPrintWidget)中创建或修改工作文件后,点击“保存”按钮将场景数据序列化为 XML 文件。随后,用户在打印主界面(MainWidget)中选择工作文件并点击“打印”。 重要的工作流程位于InkjetPrinter::loadWorkFileAndPreparePrint函数中,流程如下:
用户点击 [MainWidget::m_AddBtn](../MainWidget.cpp#L143) (调入文件喷印) 发送 sendButtonClickedSignal(2) 信号
└── InkJetPrinter::getMainWidgetButtonClickedSlot() 接收信号打开 DialogFileOperation 对话框
└── InkjetPrinter::loadWorkFileAndPreparePrint() 通过对话框输入的文件名打开文件
└── PicSceneLoader::loadSceneFromFile() 解析 XML 文件,恢复场景内容和打印设置
└── MainWidget::generatePrintContent() 将场景渲染为打印数据并写入缓冲区
└── 等待用户按下 开始打印
└── MainWidget::SendPrintDataToFpga() 全量发送打印数据与设置到FPGA,并开始打印
注意打开并解析工作文件的过程中不会直接发送打印数据到FPGA,只有在用户点击“打印”按钮后,才会调用 SendPrintDataToFpga() 将打印数据发送至FPGA。
7.3 工作文件编辑
韩国QtUI中,工作文件编辑 被解耦为一个独立模块,它只负责对工作文件进行新建、编辑和调用PicSceneLoader模块保存,其主要实现基本位于TestPrintWidget,TestPrintWidget通过读取指定工作文件(或新建),在编辑完成后可以对文件进行保存。
用户点击 (新建文件) (编辑文件) 发送信号到InjkectPrinter
└── InkJetPrinter判断当前文件名,将文件名传给TestPrintWidget,并切换到TestPrintWidget视图
└── TestPrintWidget完成编辑后询问用户是否保存已编辑的工作文件
├── 用户选择保存,TestPrintWidget 使用 PicSceneLoader 写入xml工作文件
│ └─ 保存文件后发出信号通知 InjkectPrinter
│ └─ InkjectPrinter 切换到 MainWidget 并调用 loadWorkFileAndPreparePrint 载入刚刚保存的文件
│ └─ 之后的流程与 7.2 小节一致
│
└── 用户选择不保存,TestPrintWidget 直接发出信号通知 InjkectPrinter
└─ InkjectPrinter 切换到 MainWidget,然后什么也不做
7.4 设备状态轮询
timerHandler()
├── serialFPGA->readData() # 读取FPGA状态寄存器
├── serialSTM32->readData() # 读取STM32传感器数据
├── saveFPGAStatus() # 解析FPGA状态
│ ├── 墨线开关、高压状态、回收故障
│ ├── 墨水/溶剂液位警告
│ └── 相位检测结果
├── saveSTM32Status() # 解析STM32状态
│ ├── 齿轮泵转速
│ ├── 脉冲计数
│ └── 压力/粘度值
├── MainWidget::updateSysStatusToUI() # 更新界面状态灯
└── autoControlValvePump() # 自动控制执行
7.5 信号槽通信概览
Serial::receivedFromFPGA ──→ InkJetPrinter::saveFPGAStatus()
Serial::receivedFromSTM32 ──→ InkJetPrinter::saveSTM32Status()
MainWidget::sendButtonClickedSignal ──→ InkJetPrinter::getMainWidgetButtonClickedSlot()
TestPrintWidget::sendButtonClickedSignal ──→ InkJetPrinter::getTestPrintWidgetButtonClickedSlot()
RunTimeCtrl::sig_alertTimeout ──→ InkJetPrinter::slt_warningMaintenance()
RFIDManager::sig_showMsg ──→ InkJetPrinter::slt_showMsg()
8. RFID刷卡模块
8.1 模块概述
职责: 管理IC卡(墨水卡、溶剂卡、保养卡)的读写与验证。
功能:
- 墨水/溶剂添加验证(刷卡 + 物理添加)
- 保养卡识别与提醒
- 卡片使用标记(防重复使用)
- 超级卡的识别与处理
加密: 使用SM3(哈希)+ SM4(对称加密)国密算法保护卡片数据。
8.2 刷卡流程
检测到墨水/溶剂不足
└── 弹出刷卡提示对话框
└── 用户刷卡
├── RFIDManager 读取卡片数据
├── 验证卡片类型和有效性
├── 标记卡片为已使用
└── 通知 InkJetPrinter 更新报警状态
9. 编译构建系统
9.1 编译配置
项目使用 qmake 构建系统,主配置文件为 QtUI.pro。
目标平台:
- ARM Linux:
TARGET = QtUI - 交叉编译: 使用
linux-aarch64-gnu-g++mkspec - x86桌面: 使用
linux-g++mkspec,用于开发调试
9.2 模块依赖
QT += core gui network serialport virtualkeyboard sql xml
9.3 编译命令
下面给出 InkjetUbuntu-T1 环境下调试、发布的编译方式
# ARM交叉编译
cd /path_to_your_arm_build_dir/ && /home/inkjet/QtSDK/bin/qmake /path_to_your_sources_dir/QtUI.pro -spec linux-aarch64-gnu-g++ CONFIG+=release
make -j
# x86桌面编译(调试)
cd /path_to_your_x86_build_dir/ && /home/inkjet/QtSDKPC/bin/qmake /path_to_your_sources_dir/QtUI.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug
make -j
9.4 发行编译
VX5 Release编译发行.md 给出了如何发布带崩溃转储的程序的流程
10. 关键配置与宏定义
10.1 全局宏 (myinclude.h)
| 宏 | 说明 |
|---|---|
__RFID_CARD |
启用刷卡功能 |
__RFID_OLD |
旧加密算法 |
__RFID_IND |
印度二次加密 |
MULTILANGUAGE |
多语言输入法 |
EnableArabic |
阿拉伯语支持 |
EnableBangla |
孟加拉语支持 |
TEST_MODE |
测试模式 |
SIMULATE_PRINTING_MODE |
模拟打印模式 |
10.2 路径定义 (SysPara.h)
| 路径宏 | 值 | 说明 |
|---|---|---|
PARA_ROOT_DIR |
/home/plg/conf/ |
系统参数目录 |
DOC_ROOT_DIR |
/home/plg/doc/ |
作业文件目录 |
SYS_ROOT_DIR |
/home/plg/ |
系统根目录 |
UDISK_DOC_ROOT_DIR |
/udisk/doc/ |
U盘文档目录 |
10.3 版本号 (VerBVersion.h)
#define UP_PRINTER_MAJOR_VER 6
#define UP_PRINTER_MINOR_VER 7
#define UP_PRINTER_RIVISION_VER 5
#define SUB_VERSION "_KOR"
版本号分为年、月、本月第几次编译,SUB_VERSION表示是否是标准版,"_Std" 表示标准版,"_KOR" 表示韩国定制版、"_RFID" 表示是标准版基础上增加了刷卡功能,如果客户定制版本包含了刷卡功能,则显示客户后缀。
11. 上手指南
11.1 开发环境搭建
- 安装Qt: 推荐 Qt 5.12+ 用于桌面开发调试
- 获取代码: 找到你的领导,通过SVN获取源码
- 编译运行:
- 直接使用 InkjetUbuntu-T1 虚拟机中的 QtCreator 打开此项目,然后编译调试。
- 使用 VSCode ssh 连接 InkjetUbuntu-T2(从T1升级至Ubuntu20.04,以支持VSCode SSH连接) 虚拟机,然后直接在windows上远程开发,此方式需要自行配置编译环境,编译为ARM版本的命令为:
$ /home/inkjet/QtSDK/bin/qmake ./QtUI.pro -spec linux-aarch64-gnu-g++ CONFIG+=release $ make -j8 - 注意事项: x86桌面版仅用于UI调试,硬件相关功能(串口、FPGA通信)不可用。
11.2 代码阅读顺序建议
- 入门: main.cpp → myinclude.h → InkJetPrinter.h
- 核心数据: SysPara.h → DevOp.h
- UI页面: MainWidget → TestPrintWidget
- 场景系统: scene/picscene.h → scene/PicSceneLoader.h → scene/ItemCommon.h
- 通信层: Serial/serial.h
- RFID: rfid/rfidmanager.h
11.3 常见开发任务
| 任务 | 涉及文件 | 说明 |
|---|---|---|
| 添加新图元类型 | scene/ 目录 |
继承 PicTextItem,实现渲染和序列化 |
| 修改打印设置 | Printsetting.h/cpp |
修改 PrintSettingModel 结构体 |
| 添加新语言 | *.ts 文件 |
使用 Qt Linguist 编辑翻译 |
| 修改FPGA通信 | DevOp.h/cpp + Serial/ |
注意地址空间分配和CRC校验 |
| 修改UI样式 | .ui 文件 |
使用 Qt Designer 编辑 |
| 添加新功能页面 | 仿照现有页面模式 | 创建 .h/.cpp/.ui 三件套 |
| 添加网络通信 |
11.4 关键设计模式
- 单例模式:
RFIDManager,RunTimeCtrl,LogInfoCtrl使用单例 - 观察者模式: 大量使用Qt信号槽进行模块间通信
- 策略模式: 打印触发模式(时延/电眼/同步器)通过枚举切换
- MVC变体: 场景系统使用 ViewModel (
ViewModels.h) 解耦编辑器与图元
11.5 调试技巧
- 日志: Debug模式下使用
qInfo()/qWarning()/qCritical()输出,日志文件位于/home/plg/conf/,发行版使用LogInfo::setRunStatus() - 崩溃分析:
dump.h/cpp安装了信号处理器,崩溃时会生成core dump - 泵阀手动控制: 可通过
SystemManage界面手动控制阀门和泵 - 模拟模式: 设置
SIMULATE_PRINTING_MODE 1可在无硬件环境调试打印逻辑
11.6 注意事项
- 不要直接操作硬件寄存器: 必须通过
DevOp类进行设备操作 - 参数持久化: 修改系统参数后需调用
SysPara的保存方法 - 线程安全: 串口通信在独立线程中,注意跨线程信号槽的连接方式
- 版本兼容: 注意
#ifdef条件编译宏,不同客户可能有不同的功能组合 - UI文件: 项目使用
.ui文件定义界面,编译时通过uic生成ui_*.h文件 - 编码: 所有源文件使用 UTF-8 编码,字符串使用
QString::fromUtf8()或tr()
文档维护: 本文档应随项目迭代持续更新。如有疑问,请联系项目负责人。
文档更新记录
- 2026-07-29:继续完善了此文档 - 卜永仕
- 2026-07-23:创建此文档 — 卜永仕