当前用QT来开发嵌入式图形界面越来越收到开发者的欢迎。如果用过微软的Visual Studio,那么再来开发PC版的QT,就很容易了。而为嵌入式平台开发GUI和其他的嵌入式工程一样,都需要交叉编译环境,搭建好交叉编译环境后,在PC上做好的GUI只需交叉编译一次就可以在嵌入式平台上运行了,PC版本的QT安装,我已经在博文中详细描述过了。为Zynq平台安装交叉编译环境的具体安装方法,官网(www.wiki.xilinx.com/Zynq+Qt+and+Qwt+Base+Libraries-Build+Instructions)上,有详细的描述,只要耐心的按照官网上的步骤一步步耐着性子做,就可以安装成功。需要指出的是,这一步是在PC上做的,而不是在开发板上做的,至少我是这样做的,make这一步是非常耗时的,大概要接近3个小时。印象中会出错的地方主要集中在配置也就是./configure这一步,官网如下,
bash> ./configure \
-embedded arm \
-xplatform qws/linux-arm-gnueabi-g++ \
-little-endian \
-opensource \
-host-little-endian \
-confirm-license \
-nomake demos \
-nomake examples \
-prefix $ZYNQ_QT_INSTALL
这一步大家尤其要注意的是,每一行命令前面的小段线,容易忘记而导致失败。安装好后,那么在我们的
PC上就有2个编译工具qmake, 在安装的过程中,我们已经将那个负责交叉编译的qmake加入环境变量,
也就是说我们在命令行中可以自动补全的qmake,就是交叉编译的qmake,而不是PC版的qmake,
那个qmake在运行PC QT的时候自动调动,它具体位置应该是,/opt/QT....../bin, 按官网一步步走到最后,
得到镜像qt_lib.img, 这是在开发板上运行qt工程必须的库文件,要拷到SDk卡上,在开发板上运行QT工程,
要先挂载这个镜像。做好这些后,可以先交叉编译一个Hello Word程序试试。我的效果图如下,
安装好了,交叉编译环境后,我们就可以开始为我们自定义的IP开发一个GUI了,打开PC版本的QT,如果使用CentOS系统的话,那么这是你的Qt Creator 肯定已经在 -->Applications-->Programming里边了,点击图标Qt Creator,打开Qt Creator, 当然你也可以自己到安装目录中找,然后运行可执行文件qtcreator。 Qt creator 是QT的工具之一,你也可以用designer,2者差不多。
Qt Creator 启动后,-->File-->New File or Project,然后选中Qt Gui Application, 接下来为我们的工程取好名字,找好存储位置。在生成的Form中,拖入几个元素如图,
改变其中的PlainText和Object Name,改Objectname的目的是为了编程方便。几个Object中最中要的就是OK按钮, 它的objectname我改成了btn1, 改动好了以后,选中OK按钮,右键-->Go to Slot-->clicked(), 学过VB.net的朋友就很清楚了,我们这儿是为OK按钮设置了一个事件,当它被点击的时候,会运行一些程序,是那些程序呢,这时候Qt Creator会自动进入程序编辑页面,光标停留的位置,就是写程序的位置,我们在这儿入这样一行程序,
myled_write(ui->txt1-toPlainText().toInt());
意思是,当OK按钮被点击的话,就将UI中的元素txt1的PlainText转化成整型传递给函数myled_write, 那么, 前边我们写好了驱动,留好了API 也就是文件/proc/myled, 显然,函数myled_write的作用就是把PlainText的值写入文件/proc/myled, 这就变成C/C++语言下的文件操作了,这就不难实现了,你可以在相同界面下写好这个函数,也可以在相同目录下新建一个myled.h,然后include "myled.h", 注意这儿是" ", 而非<>. 在myled.h中写入下边的代码,
#ifndef myled_H
#define myled_H
#include
#include
#include
#include
#include
void myled_write(int led_value)
{
int nwrite;
char buff[2];
sprintf(buff,"%d",led_value);
nwrite = strlen(buff);
int fp = open("/proc/myled",O_WRONLY);
write(fp,buff,nwrite);
close(fp);
}
#endif // myled_H
大家知道,C语言中文件操作有2套函数,fopen, fread, fwrite等和read(), write(). 当然,linux下Shell脚本也可以实现相同的目的,比如命令echo, cat。这一切都做好后,首先在PC环境中调试,如果运行没有问题的话就可以开始交叉编译了,打开一个Terminal,然后cd到工程目录下, 运行命令 qmake -project, 没有错误的情况下,运行qamake, 这时在工程目录下看到Makefile, 接着make, 得到和工程名称相同的可执行文件,把它复制到开发板的SD卡上。之后把SD重新插到开发板上,给开发板上电,打开终端TeraTerm, 输入图中的命令。
大家可能已经注意到了,我已经设置好了程序自动运行,所以省去了挂载mmcblk0p1和insmod myled.ko的命令,直接就可以挂载qt_lib.img 还有运行QT工程了,最后再一次展示效果图。