QT跨平台开发技术总结

2022-03-24 09:21:21 浏览数 (1)

1、摘要

在做跨平台(这里指的是嵌入式Linux图形界面应用程序开发)图形界面应用开发中,当资源充足的情况下,我们常常会首选QT来作为开发工具。在现实开发工作中,我们可以需要好几个人来完成整个大型应用程序的开发,例如这是一个带有物联网功能和图形界面的传感器检测嵌入式软件项目。那么在开发中可能会去实现这些功能:

(1)UI程序逻辑开发

(2)传感器程序逻辑开发

(3)联网功能(例如WIFI、LAN)

2、单独开发各自的业务

使用QT开发这样的程序是可以分开来进行实现的,例如负责UI程序逻辑开发的,他可能是项目总工程师,而传感器程序逻辑开发、联网功能可能交给一些其它的同事,他们的任务就是提供一些类和接口,那么总工程师需要调用他们提供的类和接口来完成整个程序显示和逻辑的交互。

UI界面交互(不涉及业务逻辑,仅仅是界面跳转切换功能)通常来说是可以在PC端实现的,它的实现不需要与平台有关联,因此它可以直接在PC端实现,不需要有硬件平台介入。

传感器程序逻辑开发,如果这是一个由串口协议进行封装的,那么它也可以在Window PC端调用QT的串口库进行开发和验证,如果确实需要与相应的硬件平台接口交互,那就没办法了,只能单独实现接口。

而联网功能,可能就需要硬件平台提供,例如WIFI的连接、断开等业务逻辑,因此这些单独的类和接口的实现和验证可能需要在Linux环境下进行交叉编译,然后运行在硬件平台上进行验证。

3、合并开发业务

各自的程序开发完了,这时候轮到项目总工需要对UI和其它功能模块进行业务联调,那么请思考一个问题?合并完了,如何保证各自之间的业务依然可以照常进行调试,不受平台影响?有几个比较好的方法:

例如,我们可以用Qt提供的这组宏来实现:

代码语言:javascript复制
#ifdef _WIN32
#define Sensor_Uart               "COM6"
#define OTA_APP                   "G:\app"
#define FILE_UDISK_PATH           "G:\"
#define FILE_LOCAL_PATH           "D:\Users\Desktop\test"
#define WIFI_SSID_FILE_PATH       "D:\Users\wifi_ssid.txt";
#else
#define Sensor_Uart               "/dev/ttyS5"
#define OTA_APP                   "/mnt/app"
#define FILE_UDISK_PATH           "/customer/udisk"
#define FILE_LOCAL_PATH           "/customer/gcode"
#define WIFI_SSID_FILE_PATH       "/customer/wifi_ssid.txt";
#endif

当在Window平台下编译时,会用这组参数:

代码语言:javascript复制
#define Sensor_Uart               "COM6"
#define OTA_APP                   "G:\app"
#define FILE_UDISK_PATH           "G:\"
#define FILE_LOCAL_PATH           "D:\Users\Desktop\test"
#define WIFI_SSID_FILE_PATH       "D:\Users\wifi_ssid.txt";

当在非Window平台下编译时,会用这组参数:

代码语言:javascript复制
#define Sensor_Uart               "/dev/ttyS5"
#define OTA_APP                   "/mnt/app"
#define FILE_UDISK_PATH           "/customer/udisk"
#define FILE_LOCAL_PATH           "/customer/gcode"
#define WIFI_SSID_FILE_PATH       "/customer/wifi_ssid.txt";

这样的话在Linux下进行交叉编译和在Window平台下进行编译的运行方法就分开了。如果提供类和接口的同事是以一个工程的形式进行提供,例如是.pri的形式,那么我们可以在.pro文件中添加一个unix块:

代码语言:javascript复制
unix {
#wifi
//添加对应的库和文件
include( ./wifi/wifi.pri)
INCLUDEPATH  = /usr/local/openssl-1.1.1m/include
LIBS  = -L /usr/local/openssl-1.1.1m/lib/ -lcrypto -lssl
INCLUDEPATH  = /opt/lib/curl-7.79.1/include
LIBS  = -L/opt/lib/curl-7.79.1/lib -lcurl
}

即,当在Window环境下编译时,不会包含这些文件和库:

代码语言:javascript复制
include( ./wifi/wifi.pri)
INCLUDEPATH  = /usr/local/openssl-1.1.1m/include
LIBS  = -L /usr/local/openssl-1.1.1m/lib/ -lcrypto -lssl
INCLUDEPATH  = /opt/lib/curl-7.79.1/include
LIBS  = -L/opt/lib/curl-7.79.1/lib -lcurl

当在Linux环境下编译时,会将上面这些库包含进来编译。这样就可以做到Window和Linux来回切换调试了,如果在调试过程中发现问题了,那么相应的模块继续分开调试,然后再合并工程,直到调试成功为止。

0 人点赞