嵌入式GUI与Qt/Embedded

2019-07-13 06:35发布

     由于开发中使用的开源嵌入式3D图形库Klimt是基于OpenGL 和OpenGL|ES的,而OpenGL和OpenGL|ES需要有嵌入式GUI的支持,以提供给它与图形设备的接口,以便把三维图像显示给用户。所以我需要选择一种嵌入式GUI系统,然后把它移植到嵌入式Linux上,再有是把基于OpenGL的Klimt移植到这个GUI上。
    通过对几种嵌入式GUI的详细比较,并且结合我的嵌入式3D开发的要求,我决定选择Qt/Embedded 作为我开发的嵌入式GUI,对于研究用途,它是GPL授权的,比较高效,可移植性很强,QT提供丰富的调试和开发工具,有丰富的图形开发接口。
    接下来我们需要对Qt/Embedded进行到嵌入式Linux上的移植。下面我们可以简称Qt/Embedded为QtE。
.1 配置Qt/Embedded移植环境
Qt/Embedded的移植过程中需要用到一些工具或者一些环境设置,所以在移植之前我们需要对这些工具或环境进行配置。
.1.1 配置交叉编译工具链
对于ARM架构的嵌入式处理器,互联网上有自由的ARM Linux 交叉编译工具链,工具链中包括一切交叉编译我们的ARM平台程序时使用的编译程序,链接程序,优化程序,常用的函数库等等。获得后交叉工具链后只要安装在PC机上的文件系统就可以供我们使用。
.1.2 配置环境设置
移植Qt/Embedded过程中,它需要在环境设置中读取交叉编译链的路径,以便实现到目标机器ARM平台的交叉编译,而不是x86平台的编译;还有读取动态连接库的路径等等,指定Qt/Embedded交叉编译过程中需要使用的函数库。
那么我们需要设置的是
交叉编译工具的路径,我需要使用的交叉编译工具是armv4l-unknown-linux工具,那么我要把先前交叉编译工具链的路径加入到名称为PATH的环境变量中。可以使用export系统命令设置,或者在系统配置文件中进行设置。
指定Qt/Embedded的路径。Qt/Embedded交叉编译时需要使用的它存放目录的qmake(QtE程序Makefile生成程序),moc,qws交叉编译配置等工具,所以我们需要把QTDIR环境变量设置为Qt/Embedded的目录,还有把Qt/Embedded交叉编译后的核心库存放的路径加入到LD_LIBRARY_PATH环境变量中,以便编译QTE程序时链接时使用。
.2 定制Qt/Embedded
由于Qt/Embedded是以面向多领域应用的嵌入式GUI系统,所以针对目前的嵌入式3D开发,它有许多模块和特性是我们不需要的,这样我们就可以根据自己的需求,对Qt/Embedded进行定制,去掉一些不需要的特性或模块,也可以添加需要的特性或者模块。
Qt/Embedded 有专门的一个configure 脚本可以帮助我们定制,而不用手动定制。
首先我们需要指定交叉编译目标平台的配置参数“-xplatform”,这个参数可以指定一个用于目标平台编译配置文件,文件里指定了所要使用的交叉编译工具,这要视你选择的交叉编译链而定;还有是一些编译参数。Qt/Embedded的嵌入式移植都是用QWS(Qt Window System)模式,所以编译配置文件的编写可以参考它自带的一些编译配置文件,或者如果自带的编译配置文件里有跟你的意愿是一样的,可以直接使用。
然后使用“-depths” 指定颜 {MOD}深度列表,Qt/Embedded 支持多种颜 {MOD}深度,有4,8,16,32,这对后面的3D程序很重要,我的开发板上的LCD的颜 {MOD}深度是16位,所以配置时 16是肯定要的,否则三维图像的颜 {MOD}显示将会出现问题。
其次可以使用“-no”“-disable”参数去掉一些不使用的模块,如cups模块,stl模块,xml模块等。这样可以大大减少Qt/Embedded核心库的大小,有利于节省嵌入式设备的存储空间。
.3 交叉编译Qt/Embedded
可完全编译,包括例子,也可以只编译Qt/Embedded的核心库。编译后得到Qt/Embedded的动态链接核心库,以备接下来开发QtE程序开发和移植Klimt移植之用。
.4 开发Qt/Embedded程序,并在开发板上调试运行
由于接下来的3D程序都是基于QtE系统的,所以必须了解QtE程序开发调试的一些基本流程。
由于QtE是完全使用C++开发的系统,所以一般QtE程序也使用C++进行开发。保证可读性和可扩展性。对于使用QtE GUI的嵌入式应用程序,一般继承QtE的QWidget 或者其子类,然后在代码中定制自己的功能。在每个QtE程序中必须有一个QApplication的实例,通过这个实例,初始化你自己继承QWidget或其子类的对象,通过调用QApplication的相关方法就可以运行QtE的GUI程序了。下面是一个示例:
#include
#include
int main(int argc, char **argv)
{
    QApplication app (argc, argv);
    QLabel *hello = new QLabel("

HelloQt/Embedded!

", 0);
    app.setMainWidget(hello);
    hello->show();
    return app.exec();
}

交叉编译好后就可以通过前面已经配置好NFS网络文件共享对QtE程序进行在开发板上的调试运行。
QtE的嵌入式程序运行时是需要添加“-qws参数”,意思是指定QtE程序以QWS(Qt Window System)模式运行。