Qt-embedded-linux移植要点Qt

安装qt 对系统的 要求

安装 qt 的过程在不同的平台上会有所不同,主 要关嵌入式 linux 平台上如何安装。若需要提供对 OpenSSL 的 支持,需要通过单独安装 OpenSSL Toolkit, 来获得 Secure Sockets Layer (SSL) 。对于不同的平台上,会有不同的要求。下面具体关注嵌入式 linux 的 要求。如果要在 qt 上对 QtWebKit 模 块的支持,必须使用 uClibc 0.9.29 或者更高的版本,以对 pthread 的 支持。在内存方面的要求主要取决于体系架构以及在编译过程中使能的 QT 选项。下面是针不同平台上 qt 支 持库的大小。

Architecture      

Compiler

QtCore

QtGui

QtNetwork

QtWebKit

Minimal

Normal

Minimal

Normal

Minimal

Normal

Minimal

Normal

linux-x86-g++

GCC 4.2.4

1.7M

2.7M

3.3M

9.9M

653K

1.1M

N/A

17M

linux-arm-g++

GCC 4.1.1

1.9M

3.2M

4.1M

11M

507K

1.0M

N/A

17M

linux-arm-g++ (thumb)

GCC 4.1.1

1.7M

2.8M

4.0M

9.8M

409K

796K

N/A

17M

linux-mips-g++ (MIPS32)

GCC 4.2.4

2.0M

3.2M

4.5M

12M

505K

1003K

N/A

21M

2 qt-embedded-linux的安装

(1)下载源码包,解压;

       下载开源嵌入式版本的网址:http://download.qtsoftware.com/qt/source/ 常 用官网

qt news:http://www.qtsoftware.com/about/news

qt downloads:http://www.qtsoftware.com/downloads

qt Quarterly:http://doc.trolltech.com/qq/

qt bugs:http://www.qtsoftware.com/developer/task-tracker

qt Supported Platforms:http://doc.trolltech.com/supported-platforms.html

qt Version Changes :http://www.qtsoftware.com/developer/changes

qt books: http://www.qtsoftware.com/developer/books   

(2)建立支持库

       通过./configure来设置,主要配置可以通过--help来获得帮助;之后用make命令,然后用make install 命令。将库安装到指定的路径下面。其中的设置包括指定安装的路径;未配置的话,默认的路径是/usr/local/Trolltech /QtEmbedded-4.5.0;

(3)设置环境变量

       为了能够使用Qt for Embedded Linux, 必须导出的PATH变量有qmake, moc 以及其他Qt for Embedded Linux 的工具, 以及LD_LIBRARY_PATH 必须导出。例如:    PATH=/usr/local/Trolltech/QtEmbedded-4.5.0/bin:$PATH

      export PATH

(4)建立虚拟的frambuffer。

       建立虚拟的frambuffer,需要安装X11 Platforms .

 

3 嵌入式linux版本的qt环境变量

POINTERCAL_FILE 指定文件包含 的数据,用来校准触摸笔设备。同时可以参考QWSCalibratedMouseHandler and Qt for Embedded Linux Pointer Handling.

QT_ONSCREEN_PAINT 如 果定义了的话,可以用来将控件显示在屏幕上。如果没有其他控件在同一个区域的话,该设备响应的区域将不会随着屏幕设备驱动的改变而改变。设置这个环境变量 相当于在控件中应用程序中设置Qt::WA_PaintOnScreen。

QWS_SW_CURSOR :如果定义了的话,软件鼠标的光标将一直是可用的。(即 使使用硬件加速驱动器来支持硬件光标)

QWS_DISPLAY :指定显示形式和framebuffer.例 如:export QWS_DISPLAY=<driver>[:<driver specific options>]...[:<display num>]

QWS_SIZE :指定嵌入式linux qt窗口在屏幕上的大小。export QWS_SIZE=<width>x<height>

QWS_MOUSE_PROTO :指定触摸设备。 export QWS_MOUSE_PROTO=<driver>[:<driver specific options>],<driver>参数可以是MouseMan, IntelliMouse, Microsoft, VR41xx, LinuxTP, Yopy. Tslib and keys。/dev/mouse 指的是鼠标设备, /dev/ts for touch panels。

QWS_KEYBOARD 为输入设备指定输入设备和驱动。比如:export QWS_KEYBOARD=<driver>[:<driver specific options>]。<driver>参数可以是SL5000, Yopy, VR41xx, TTY, USB and keys,指定的是一个标准设备。比如:/dev/tty0。

4 在嵌入式linux上运行qt程序

任何嵌入式linux应用程序可以通过构建QApplication 对象QApplication::GuiServer的格式,被构建为服务server application。或者通过-qws命令行选项的方式。本文当假设用The Virtual Framebuffer 或者嵌入式linux的VNC协议,或者正确配置的Linux framebuffer。而且没有服务进程在运行。可以使用的显示方式有:

    Using a Single Display

    单显示,运行这种显示方式,改变Linux console,而且选择一个应用来运行。它要求在安装过程中,环境变量是可用的。它要求指定的硬件设备驱动必须工作正常。比如:

    cd path/to/QtEmbedded/demos/textedit

    ./textedit -qws

    * Using Multiple Displays

    linux同时也是支持多设备显示。有两种方式可以完成。当在运行多服务程序的时候,显示屏的驱动(以及数量)必须为每一个程序进行指定。用 -display命令行或者QWS_DISPLAY 来指定。比如:

    ./myfirstserverapplication -qws -display "transformed:rot90:1"

    ./mysecondserverapplication -qws -display "QVFb:2"

需要注意的是,必须指定一个显示设备,在开始客户端程序的时候。比如:./myclientapplication -display "QVFb:2"。在程序运行的时候,没有办法将一个客户端程序从一个显示移动到另一个显示。用多显示屏驱动,另一方面,应用程序可以方便的在两个不同类 型的显示屏之间切换。多屏幕显示可以用-display命令行参数来指定 或者通过设置QWS_DISPLAY环境变量比如: ./myserverapplication -qws -display "Multi: QVFb:0   QVFb:1:offset=0,0 VNC:offset=640,0 :2"

    * Command Line Options

    命令行选项

5 移植qt在嵌入式linux的应用

    移植过程和移植到x11平台上的差别不大,遵守通用的移植过程。然后还包括几个方面:字体库移植,设置环境变量以及Framebuffer的支持。

   字体库的支持:是在qt的/lib/fonts目录下。由于程序运行的时候是到这个文件夹下面来调用,因此需要将字体库复制到这个目录下。

   环境变量的设置:通常情况下,与默认的环境变量不同,因此需要设置的有QWS_MOUSE_PROTO, QWS_KEYBOARD 以及 QWS_DISPLAY,用来指定鼠标、键盘以及显示设备管理。在./configure 的时候需要加入的选项是-qt-kbd-<keyboarddriver> and -qt-mouse-<mousedriver> ,这样才能使能这些设备驱动。但是还需要指定一个具体的设备,因此需要通过设置环境变量来完成。

   framebuffer的支持:没有特殊需求的情况下,要求在目标设备上使能framebuffer。Linux framebuffer在标准设置情况下是使能的。

6 嵌入式linuxqt 显示管理

当需要显示的时候,默认的动作是每一个嵌入式linux的客户端将需要的显示的色调存放在内存中,然后服务端将相关的数 据从内存在中送到显示屏上。服务端用显示屏驱动copy内存中的内容到显示屏上显示。显示屏的驱动是在服务端应用加载的时候运行的,用的是qt的插件系 统。常用的方式有:可用的驱动;指定一个驱动;子驱动和多驱动。

    Available Drivers 可用的驱动

嵌入式linux的qt提供的驱动有Linux framebuffer, the virtual framebuffer, transformed screens, VNC servers and multi screens.通过运行./configure 选项来列出可用的驱动。默认的配置是不加速的Linux framebuffer driver (/dev/fb0) 被打开。其他的设备驱动也可以使能或者禁止,通过以下命令行。例如:./configure -qt-gfx-transformed

   Specifying a Driver 指定一个驱动

   通过设置环境变量QWS_DISPLAY来指定一个设备。比如:格式如下的: export QWS_DISPLAY="<driver>[:<driver specific options>]... [:<display num>]" <driver>可以用的参数有:LinuxFb, QVFb, VNC, Transformed, Multi and keys identifying custom drivers。参数<display num>的被用来分辨用相同驱动的屏幕,而且使能多显示。如下的表格用来指定驱动。环境变量的QWS_DISPLAY也可以通过-display来 设置。比如: myApplication -display "<driver>[:<driver specific options>]... [:<display num>]"

    Subdrivers and Multiple Drivers 子 驱动和多驱动

    VNC, Transformed 和Multi screen drivers取决于子驱动。通用的语法是: export QWS_DISPLAY="<driver>[:<subdriver>][:<subdriver options>]...[ :<display num>]"至于子驱动,在每个子驱动之间加上空间是很重要的,在显示设备前加上用来分开各个驱动和显示设备。注意的是多屏幕驱动可以拥有多个子设 备驱动,比如: export QWS_DISPLAY="Multi: QVFb:0 QVFb:offset=640,0:1 :2"注意的是:VNC screen driver在没有指定屏幕驱动的情况下,默认的是虚拟屏幕驱动。在这种情况下,VNC driver有一些额外的参数来指定大小的位宽,参数有:    * size=<width x height> * depth=<value>   * mmHeight=<physical height in millimeters>

* mmWidth=<physical width in millimeters> 。例如:export QWS_DISPLAY="VNC:size=720x480:depth=32"。例如运行VNC屏幕驱动在Linux framebuffer driver的情况下,则:export QWS_DISPLAY="VNC:LinuxFb"

7 输入设备键盘和鼠标的设置与管理

       当运行一个Qt for Embedded Linux应用程序的时候,不管是作为一个服务还是连接到另一个服务,当它开始运行的时候,鼠标驱动被服务的应用加载,用qt的plugin system。 在配置qt的时候通过选项来选择支持的鼠标以及键盘设备,同时测试可用的设备。通过 ./configure -help 查看可用的设备,配置时候默认的是PC的鼠标驱动。如果是自己添加一个设备,比如触摸屏,则需要创建一个 QWSCalibratedMouseHandler subclass来完成校验功能。若提供的pc的鼠标被使能,Qt for Embedded Linux将会自动探测所支持的一种鼠标设备,这个设备是在/dev/psaux 或者 /dev/ttyS的一种。如果多种类型的都检测到的话,则多种同时支持。需要注意的是,Qt for Embedded Linux 不支持自动检测触摸屏设备,因此需要指定使用的是哪一种。要设置环境变量QWS_MOUSE_PROTO ,例如:export QWS_MOUSE_PROTO=<driver>[:<driver specific options>],其中的参数<driver>可以是MouseMan, IntelliMouse, Microsoft, VR41xx, LinuxTP, Yopy, Tslib and keys,driver specific options是一个标准设备,比如:dev/mouse,触摸屏的是/dev/ts。多鼠标可以用下列方式来指定。

export QWS_MOUSE_PROTO="<driver>[:<driver specific options>]

         <driver>[:<driver specific options>]

         <driver>[:<driver specific options>]"

需要注意的是:Vr41xx 驱动有两个可选的参数:press=<value>来定义单击的时间(默认值是750);filter=<value> 指定的是滤波长度。用于虑掉噪声。比如:

        export QWS_MOUSE_PROTO="Vr41xx:press=500:/dev/misc/ts"

对于The Tslib Mouse Driver是一个继承QWSCalibratedMouseHandler的类,在产生鼠标事件的时候,提供校验和滤波的功能,用于使用同一的触摸屏的 库。为了使用鼠标,必须编译的选项是-qt-mouse-tslib。此外,tslib的头文件和库也要在build的环境变量中指出来。tslib 的源码可以在http://tslib.berlios.de. 下载。通过-L 和-I 来指定库和头文件的位置。比如: ./configure -L <path to tslib library> -I <path to tslib headers>。为了保证能够使用鼠标,tslib必须正确的安装在目标机上。包括提供一个ts.conf 配置文件和设置必要的环境变量。ts.conf包括两行:内容是: module_raw input

      module linear在make Qt for Embedded Linux 时候特别指定tslib 鼠句柄,设置环境变量QWS_MOUSE_PROTO 。可能出现问题的地方是设备文件和文件权限两个方面。为了保证能够正确的使用设备文件,第一步,先测试一下设备文件是否有输出。比如:如果指定的鼠标设备 驱动是:QWS_MOUSE_PROTO=IntelliMouse:/dev/input/mouse0,然后检查设备的输出,通过在控制台上敲: cat /dev/input/mouse0 | hexdump,移动鼠标后,如果可以在控制台上看见输出,表示能够正确的使用设备,否则要重新连接设备。对于设备的读写权限,一般要求对设备至少有读权 限。比如:QWS_MOUSE_PROTO=IntelliMouse:/dev/input/mouse0,那么应该将该设备的权限设置为chmod a+rw /dev/input/mouse0。如果设备文件符号连接到另一个文件的话,必须改变相关文件的属性。

;