mini6410 qt4和qtopia编程开发指南

130
- 1 - Mini6410 Qt4 Qtopia 编程开发指南 2010-12-28 (本手册适用于 Mini6410/Tiny6410,也可供 Mini2440/Micro2440 参考) Copyright © 2007-2010 FriendlyARM All rights reserved.

Upload: duongque

Post on 02-Feb-2017

312 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Mini6410 Qt4和Qtopia编程开发指南

第 - 1 - 页

Mini6410 Qt4 和 Qtopia 编程开发指南

2010-12-28

(本手册适用于 Mini6410/Tiny6410,也可供 Mini2440/Micro2440 参考)

Copyright © 2007-2010 FriendlyARM

All rights reserved.

Page 2: Mini6410 Qt4和Qtopia编程开发指南

第 - 2 - 页

简 介

本手册由广州友善之臂计算机科技有限公司(简称“友善之臂”)创建和维护,并作为标准用户手册的

一个补充,仅供嵌入式爱好者学习参考使用,友善之臂目前并不对本手册的内容提供任何解释和解答服务,

用户可以在论坛中反馈你所遇到的问题和疑问,我们将在以后的更新中修正或者采纳您的建议,本手册主

要以首页日期为版本标志。

本手册由友善之臂软件开发工程师编写制作,以 Mini6410 作为开发演示平台,详细介绍了 Qtopia-2.2.0,

Qt-Extendded-4.4.3(Qtopia 手机版),QtE-4.7.0 等常见 Qt 版本的移植过程、应用程序开发方法(含 X86 版和

ARM 版),涉及串口编程,LED 控制,PWM 控制,中断式按键编程调用,ADC 模拟转换等嵌入式硬件操

作编程示例,并配有详细的图解,完整的源代码包,手册中还介绍了一些常见的实用技巧,例如如何增加

用户自定义程序组,如何设置开机自动运行等,非常适合嵌入式初学者学习参考之用。

Mini6410 是一款十分精致的低价高品质一体化 ARM11 开发板,由广州友善之臂设计、生产和发行销

售。它采用三星 S3C6410 作为主处理器,在设计上承袭了 Mini2440“精于心,简于形”的风格,而且布

局更加合理,接口更加丰富,十分适用于开发 MID、汽车电子、工业控制、导航系统、媒体播放等终端设

备;也可适用于 高校教学、嵌入式培训、个人研究学习和 DIY 等。

Tiny6410 是由友善之臂出品的一款以 ARM11 芯片(三星 S3C6410)作为主处理器的嵌入式核心板,它

采用高密度 6 层板设计,尺寸为 64 x 50mm,它集成了 128M DDR RAM,256M/1GB SLC Nand Flash 存储

器,采用 5V 供电,在板实现 CPU 必需的各种核心电压转换,还带有专业复位芯片,通过 2.0mm 间距的

排针,引出各种常见的接口资源,以供不打算自行设计 CPU 板的开发者进行快捷的二次开发使用。

因为 mini6410 和 tiny6410 的硬件接口和资源都是基本相同的,所以本手册完全适用于 tiny6410 开

发板,由于 Qt/Qtopia 在 2440 平台也是支持的,所以大部分内容也适用于 mini2440 和 micro2440。

本手册的源代码放在光盘 A 的以下目录:“开发文档和教程\01 Qt4 和 Qtopia 编程开发指南\源代码”。

我们欢迎各位网友复制传播本手册,但不得擅自摘抄部分或全部内容用作商业用途,违者必究,友善

之臂保留本手册的解释和修改权。

友善之臂公司网址:http://www.arm9.net

本手册由 ARM9 之家论坛(http://www.arm9home.net)发布,转载请注明出处,手册内难免有遗漏和

不足之处,欢迎大家提出宝贵意见,请发邮件至:[email protected]

Page 3: Mini6410 Qt4和Qtopia编程开发指南

第 - 3 - 页

更新说明

2010-12-28 本手册第一次发布

Page 4: Mini6410 Qt4和Qtopia编程开发指南

第 - 4 - 页

目 录

MINI6410 QT4 和 QTOPIA 编程开发指南............................................................................................................. - 1 -

目 录 ......................................................................................................................................................... - 4 -

第一章 MINI6410 和 TINY6410 开发板简介 ..................................................................................................... - 7 -

1.1 MINI6410 开发板 .................................................................................................................................. - 7 -

1.2 TINY6410 开发板 .................................................................................................................................. - 8 -

第二章 QT/QTOPIA 的简单介绍 ...................................................................................................................... - 10 -

2.1 什么是 QT ........................................................................................................................................... - 10 -

2.2 什么是 QTOPIA .................................................................................................................................... - 11 -

第三章 在 MINI6410 上建立 LINUX/QT 开发环境 .......................................................................................... - 12 -

3.1 安装 LINUX 操作系统及交叉编译器 ................................................................................................. - 12 -

3.1.1 安装 Fedora9 ....................................................................................................................... - 12 -

3.1.2 安装交叉编码器 ................................................................................................................. - 12 -

3.1.3 烧写最新 Linux 系统的 Image 到开发板 .......................................................................... - 13 -

3.2 移植 QTOPIA2.2.0 到 MINI6410 ........................................................................................................... - 13 -

3.2.1 获得 qtopia2.2.0 的源代码................................................................................................ - 14 -

3.2.2 编译 PC 版本的 qtopia2.2.0 ............................................................................................... - 14 -

3.2.3 编译 mini6410 版本的 qtopia2.2.0 .................................................................................... - 17 -

3.3 移植 QT4.7 到 MINI6410 ..................................................................................................................... - 19 -

3.3.1 获得 Qt4.7 的源代码 ........................................................................................................ - 20 -

3.3.2 交叉编译 Qt4.7 ................................................................................................................... - 20 -

3.3.3 在 mini6410 上部置 Qt4.7 .................................................................................................. - 21 -

3.3.4 在 mini6410 上运行 Qt4.7 的示例程序 ............................................................................. - 21 -

3.4 移植 QT-EXTENDED 4.4.3 (QTOPIA4.4.3) 到 MINI6410 ...................................................................... - 23 -

3.4.1 获得并安装 Qt-Extended4.4.3 源代码 ............................................................................... - 24 -

3.4.2 编译和运行 x86 版本的 Qt-Extended-4.4.3 ....................................................................... - 24 -

3.4.3 编译和运行 arm 版本的 Qt-Extended-4.4.3 ....................................................................... - 26 -

第四章 MINI6410 上的应用程序开发示例 ..................................................................................................... - 33 -

4.1 开发第一个 QTOPIA2.2.0 程序 ............................................................................................................ - 33 -

4.1.1 本示例的设计目的 ............................................................................................................. - 33 -

4.1.2 使用 designer 工具设计图形界面 ..................................................................................... - 34 -

4.1.3 编写代码 ............................................................................................................................. - 42 -

4.1.4 在 PC 上编译并运行示例 ................................................................................................... - 45 -

4.1.5 交叉编译示例程序并在 mini6410 上运行 ........................................................................ - 46 -

Page 5: Mini6410 Qt4和Qtopia编程开发指南

第 - 5 - 页

4.1.6 在 Qtopia 上添加 mycalc 程序图标 ................................................................................... - 47 -

4.2 使用 QT CREATOR 工具开发第一个 QT4 程序到 MINI6410 上 ......................................................... - 49 -

4.2.1 在 Fedora9 环境下安装 Qt Creator .................................................................................... - 49 -

4.2.2 用 Qt Creator 创建 Qt4 程序 .............................................................................................. - 50 -

4.2.3 设置 Qt Creator 使其支持交叉编译 ................................................................................... - 59 -

4.2.4 交叉编译 Qt4 程序 ............................................................................................................. - 60 -

4.2.5 将 Qt4 程序部置到 mini6410 上运行 ................................................................................ - 61 -

4.3 开发第一个 QT-EXTENDED 4.4.3 程序 ............................................................................................... - 62 -

4.3.1 步骤一:复制 HelloQt4 程序到 Qt-Extended 4.4.3 下 ..................................................... - 63 -

4.3.2 步骤二:为 HelloQt4 程序添加图标 ................................................................................. - 63 -

4.3.3 步骤三:将 Qt4 程序转换成 Qt-Extended 4.4.3 程序 ...................................................... - 64 -

4.3.4 步骤四:在 Qt-Extended 4.4.3 文件中添加对 HelloQt4 应用程序的支持 ...................... - 65 -

4.3.5 步骤五:在 Qt-Extended 4.4.3 下编译 PC 版本的 HelloQt4 ............................................ - 65 -

4.3.6 步骤六:在 Qt-Extended 4.4.3 下编译 arm 版本的 HelloQt4 .......................................... - 66 -

4.3.7 步骤七:在 mini6410 的 Qt-Extended 4.4.3 下部署并运行 HelloQt4 ............................. - 67 -

4.4 通过命令行方式创建一个 QT4 程序 ................................................................................................. - 67 -

4.5 串口助手程序的开发 ......................................................................................................................... - 69 -

4.5.1 本示例的设计目的 ............................................................................................................. - 69 -

4.5.1 串口通讯的 Qt 实现步骤及原理 ........................................................................................ - 69 -

4.5.2 使用 designer 工具设计图形界面 ..................................................................................... - 72 -

4.5.3 编写代码 ............................................................................................................................. - 77 -

4.5.4 交叉编译 serialport 程序 .................................................................................................... - 82 -

4.5.5 在 mini6410 上运行 serialport ............................................................................................ - 83 -

4.5.6 在 Qtopia 上添加 serialport 程序图标 ................................................................................ - 84 -

4.6 PWM 测试程序的开发 ....................................................................................................................... - 85 -

4.6.1 本示例的设计目的 ............................................................................................................. - 85 -

4.6.2 如何控制蜂鸣器发声 ......................................................................................................... - 85 -

4.6.3 使用 designer 工具设计图形界面 ..................................................................................... - 86 -

4.6.4 编写代码 ............................................................................................................................. - 90 -

4.6.5 交叉编译 pwm-testing 程序................................................................................................ - 94 -

4.6.6 在 Qtopia 上添加 pwm-testing 程序图标 ........................................................................... - 94 -

4.6.7 运行 pwm-testing 程序 ....................................................................................................... - 95 -

4.7 按键测试程序的开发 ......................................................................................................................... - 96 -

4.7.1 本示例的设计目的 ............................................................................................................. - 96 -

4.7.2 按键测试程序的原理 ......................................................................................................... - 97 -

4.7.3 使用 designer 工具设计图形界面 ..................................................................................... - 98 -

4.7.4 编写代码 ............................................................................................................................. - 99 -

4.7.5 交叉编译 button-testing 程序 ........................................................................................... - 104 -

4.7.6 在 Qtopia 上添加 button-testing 程序图标....................................................................... - 104 -

Page 6: Mini6410 Qt4和Qtopia编程开发指南

第 - 6 - 页

4.7.7 button-testing 程序的运行 ................................................................................................ - 105 -

4.8 ADC 测试程序的开发 ...................................................................................................................... - 106 -

4.8.1 本示例的设计目的 ........................................................................................................... - 106 -

4.8.2 A/D转换测试程序的实现说明......................................................................................... - 107 -

4.8.3 编写代码 ........................................................................................................................... - 107 -

4.8.4 交叉编译 adc-testing 程序 ................................................................................................ - 110 -

4.8.5 在 Qtopia 上添加 adc-testing 程序图标 ........................................................................... - 111 -

4.8.6 ADC 测试程序的运行 ...................................................................................................... - 112 -

4.9 LED 测试程序的开发 ....................................................................................................................... - 112 -

4.9.1 本示例的设计目的 ........................................................................................................... - 112 -

4.9.2 LED 状态设置的原理说明 ............................................................................................... - 113 -

4.9.3 使用 designer 工具设计图形界面 ................................................................................... - 113 -

4.9.4 编写代码 ........................................................................................................................... - 118 -

4.9.5 交叉编译 led-testing 程序 ................................................................................................. - 121 -

4.9.6 在 Qtopia 上添加 led-testing 程序图标 ............................................................................ - 121 -

4.9.7 led-testing 程序的运行 ...................................................................................................... - 122 -

第五章 附录 ................................................................................................................................................... - 124 -

5.1 QTOPIA 2.2.0 应用程序的编译脚本 ................................................................................................. - 124 -

5.1.1 PC 版本编译脚本 buildhost.sh ........................................................................................ - 124 -

5.1.2 ARM 版本编译脚本 buildarm.sh .................................................................................... - 125 -

5.2 QT4 和 QTOPIA 实用技巧 ................................................................................................................. - 125 -

5.2.1 如何开机自动运行 Qt4 程序? .......................................................................................... - 125 -

5.2.2 如何开机自动运行 Qtopia4.4.3? .................................................................................... - 126 -

5.2.3 如何在 Qtopia2.2.0 中添加自定义程序组? ................................................................... - 126 -

5.2.4 如何开机自动运行 Qtopia2.2.0 中的单个程序? ........................................................... - 128 -

5.2.5 如何解决 Qtopia2.2.0 图标下有一条虚线的问题? ....................................................... - 129 -

Page 7: Mini6410 Qt4和Qtopia编程开发指南

第 - 7 - 页

第一章 mini6410 和 tiny6410 开发板简介

1.1 Mini6410 开发板

Mini6410是一款十分精致的低价高品质一体化 ARM11 开发板,由广州友善之臂设计、生产和发行

销售。它采用三星 S3C6410 作为主处理器,在设计上承袭了 Mini2440“精于心,简于形”的风格,而

且布局更加合理,接口更加丰富,十分适用于开发 MID、汽车电子、工业控制、导航系统、媒体播放

等终端设备;也可适用于高校教学、嵌入式培训、个人研究学习和 DIY 等。

Page 8: Mini6410 Qt4和Qtopia编程开发指南

第 - 8 - 页

具体而言,Mini6410 具有双 LCD接口、4线电阻触摸屏接口、100M标准网络接口、标准 DB9五线

串口、Mini USB 2.0-OTG接口、USB Host 1.1、3.5mm 音频输出口、在板麦克风、标准 TV-OUT 接口、

弹出式 SD卡座、红外接收等常用接口;另外还引出 4 路 TTL 串口、CMOS Camera 接口、40pin 总线接

口、30pin GPIO接口(可复用为 SPI、I2C、中断等,另含 3 路 ADC、1路 DAC)、SDIO2 接口(可接 SD WiFi)、

10pin Jtag 接口等;在板的还有蜂鸣器、I2C-EEPROM、备份电池、AD可调电阻、8 按键(可引出)、4LED

等;所有这些,都极大地方便了开发者的评 估和使用,再加上我们按照 Mini6410 尺寸专门定制的

4.3"LCD模块,真正做到让您“一手掌握所有”!

我们还充分地发挥了 6410 支持 SD 卡启动这一特性,使用我们精心研制的 superboot,无需连接

电脑,只要把目标文件拷贝到 SD卡中(可支持大于 2G 的高速大容量卡),你就可以在开发板上极快极

简单地自动安装或运行各种嵌入式系统(WindowsCE6/Linux/Android/Ubuntu 等);甚至无需烧写,就

可以在 SD卡上直接运行它们,这一切,简直太酷了!

要了解 Tiny6410开发板的详细信息,请访问:http://www.arm9.net/mini6410-feature.asp

1.2 Tiny6410 开发板

Page 9: Mini6410 Qt4和Qtopia编程开发指南

第 - 9 - 页

Tiny6410 是一款以 ARM11 芯片(三星 S3C6410)作为主处理器的嵌入式核心 板,该 CPU 基于

ARM1176JZF-S 核设计,内部集成了强大的多媒体处理单元,支持 Mpeg4, H.264/H.263 等格式的视频

文件硬件编解码,可同时输出至 LCD 和 TV显示;它还并带有 3D图形硬件加速器,以实现 OpenGL ES 1.1

& 2.0 加速渲染,另外它还支持 2D图形图像的平滑缩放,翻转等操作。

Tiny6410采用高密度 6层板设计,尺寸为 64 x 50mm,它集成了 128M DDR RAM,256M/1GB SLC Nand

Flash 存储器,采用 5V 供电,在板实现 CPU 必需的各种核心电压转换,还带有专业复位芯片,通过

2.0mm 间距的排针,引出各种常见的接口资源,以供 不打算自行设计 CPU板的开发者进行快捷的二次

开发使用。

Tiny6410SDK是采用 Tiny6410 核心板的一款参考设计底板,它主要帮助开发者以此为参考进行核

心板的功能验证以及扩展开发。该底板具有三 LCD 接口、4 线电阻触摸屏接口、100M 标准网络接口、

标准 DB9五线串口、Mini USB 2.0 接口、USB Host 1.1、3.5mm 音频输入输出口、标准 TV-OUT 接口、

SD 卡座、红外接收等常用接口;另外还引出 4路 TTL 串口,另 1路 TV-OUT、SDIO2 接 口(可接 SD WiFi)

接口等;在板的还有蜂鸣器、I2C-EEPROM、备份电池、AD 可调电阻、8个中断式按键等。

在布局上安排上,我们尽量考虑把常用尺寸的 LCD模块能够固定在底板上,比如 3.5”,4.3”LCD,

7”LCD 等,这样用户在使用时不至于把各种电线搅在一起,更增加了开发套件的便携性。

我们还充分地发挥了 6410 支持 SD 卡启动这一特性,使用我们精心研制的 Superboot,无需连接

电脑,只要把目标文件拷贝到 SD 卡中(可支持高达 32G 的高速大容量卡),你就可以在开发板上极快

极简单地自动安装各种嵌入式系统(WindowsCE6/Linux/Android/Ubuntu /uCos2 等);甚至无需烧写,

就可以在 SD 卡上直接运行它们!

要了解 Tiny6410开发板的详细信息,请访问:http://www.arm9.net/tiny6410.asp

Page 10: Mini6410 Qt4和Qtopia编程开发指南

第 - 10 - 页

第二章 Qt/Qtopia 的简单介绍

2.1 什么是 Qt

Qt 是一个跨平台的 C++ 图形用户界面库,由挪威 TrollTech 公司于 1995年底出品,并于 2008

年 6月 17日被 NOKIA公司收购,以增强 NOKIA公司在跨平台软件研发方面的实力,更名为 Qt Software。

基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,

OWL,VCL,ATL 是同类型的东西,但是 Qt 具有下列优点:

1. 优良的跨平台特性:

使用 Qt 开发的软件,相同的代码可以在任何支持的平台上编译与运行,而不需要修改(或修改

极少)源代码。会自动依平台的不同,表现平台特有的图形界面风格。

Linux/X11:用于 X Window System(如 Solaris、AIX、HP-UX、Linux、BSD)。支持 KDevelop 和

Eclipse IDE 集成。

Mac:用于 Apple Mac OS X。基于 Cocoa 框架。支持 Universal Binary。支持以 Xcode 编辑、编译

和测试。

Windows:用于 Microsoft Windows。支持 Visual Studio 集成。

Embedded Linux:用于 嵌入式 Linux。可以通过编译移除不常使用的组件与功能。通过自己的视

窗系统 QWS,不需依赖 X Window System,直接写入 Linux 帧缓冲。可以减少存储器消耗。并提

供虚拟帧缓冲 QVFb,方便在桌面系统上进行嵌入式测试。

Windows CE / Mobile :用于 Windows CE。

Symbian:用于 Symbian platform。

Meego:用于 Meego。

2. 面向对象

Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常方

便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件 之间的

协同工作变得十分简单。

3. 丰富的 API

经过多年发展,Qt 不但拥有了完善的 C++图形库,而且近年来的版本逐渐集成了数据库、OpenGL

库、多媒体库、网络、脚本库、XML库、WebKit库等等,其核心库也加入了进程间通信、多线程等模

Page 11: Mini6410 Qt4和Qtopia编程开发指南

第 - 11 - 页

块,极大的丰富了 Qt 开发大规模复杂跨平台应用程序的能力,真正意义上实现了其研发宗旨“Code

Less; Create More; Deploy Anywhere.”。

Qt 的开发资源:

1) Qt的开发工具下载:http://qt.nokia.com/

2) Qt的开发文档:http://doc.qt.nokia.com/

3) Qt的中文论坛:http://www.qtcn.org/bbs/home.php

2.2 什么是 Qtopia

Qtopia 是基于 Qt 开发的一个软件平台,主要用于采用嵌入式 Linux 系统的 PDA 或移动电话,Qtopia

提供了窗口操作系统、游戏和多媒体、工作辅助应用程序、同步框架、PIM 应用程序、Internet 应用程序、

开发环境、输入法、Java 集成、本地化支持、个性化选项以及无线支持等,用于缩短制造商的开发周期。

TrollTech 公司在 08年被 Nokia收购后,Qtopia 被重新命名为 Qt Extended。

Nokia在推出了Qt Extended的最新版本Qt Extended 4.4.3之后的2009年3月3日,决定停止Qt Extended

的后续开发,转而全心投入 Qt 的产品开发,并逐步会将一部分 QtExtended 的功能移植到 Qt 开发框架中。

Page 12: Mini6410 Qt4和Qtopia编程开发指南

第 - 12 - 页

第三章 在 mini6410 上建立 Linux/Qt 开发环境

3.1 安装 Linux 操作系统及交叉编译器

在开始之前,读者需要先做好以下工作:

1) 安装 Fedora9;

2) 安装友善之臂提供的 mini6410 交叉编译器;

3) 烧写最新 Linux 系统的 Image 到开发板;

3.1.1 安装 Fedora9

本教程中的所有开发工作都是在发行版为 Fedora9的 Linux桌面环境下进行的,所以在开始之前,

读者需要先在 PC 上安装 Fedora9,安装方法可以参考 FriendlyARM mini6410 光盘 A中的用户文档中

的“安装并设置 Fedora9"章节。

3.1.2 安装交叉编码器

从光盘上拷贝 mini6410 上的交叉编译器到 /opt 下,目前最新的 mini6410 交叉编译器是

arm-linux-gcc-v6-vfp-20101103.tgz, 如果你的 mini6410A 光盘中的版本比较旧,建议先从友善之

臂官方网站 http://www.arm9.net下载最新的 mini6410 光盘。

在光盘上找到交叉编译后,将其拷到到 /opt 下,然后输入以下命令进行解压:

# cd /

# tar xvzf /opt/arm-linux-gcc-v6-vfp-20101103.tgz

交叉编译器会解压到 /opt/FriendlyARM/toolschain/4.5.1/ 目录下,现在将编译器路径添加到

PATH 环境变量中:

# export /opt/FriendlyARM/toolschain/4.5.1/bin/:$PATH

执行以下命令能成功显示编译器版本信息表明编译器已安装成功。

# arm-linux-gcc -v

Page 13: Mini6410 Qt4和Qtopia编程开发指南

第 - 13 - 页

3.1.3 烧写最新 Linux 系统的 Image 到开发板

Qtopia2.2.0/Qt4/Qt-Extended4.4.3 需要 Linux Kernel 和 Bootloader 的支持才能在 mini6410

上运行,本手册并不介绍如何移植 Linux Kernel和 Bootloader,因此,需要首先在 mini6410 开发板

上烧写用于 Linux 系统的 Images,再在开发板上将友善之臂提供的 Qtopia 或 Qt替换成你自已编译的

版本。

不会烧写的读者,请参考友善之臂提供的光盘上的 mini6410 用户手册。

3.2 移植 Qtopia2.2.0 到 mini6410

本章节带读者一起将 Qtopia2.2.0 移植到 mini6410 开发板上运行,其间会讲解如何编译和运行

Qtopia2.2.0 的 PC版本和 ARM版本。

本章节中会用到如下软件包,请先在光盘 A上找到以下软件包和工具:

文件名 光盘路径 说明

qtopia-free-src-2.2.0.tar.gz 开发文档和教程

\01 Qt4 和

Qtopia 编程开发

指南\源代码\第

三章\3-2

Qtopia2.2.0 源代码的官方原始包

qtopia2.2.0.friendlyarm.patch 开发文档和教程

\01 Qt4 和

Qtopia 编程开发

指南\源代码\第

三章\3-2

用于修复 Qtopia2.2.0 在 Fedora9

下编译错误的补丁包

注:我们要编译的是 Trolltech 官方提供的最原始的 Qtopia2.2.0 源码包,就算打上了上面的 patch, 也

只是修正一些编译错误,并没有增加额外的功能,保持原汁原味,因此,与友善之臂提供的 Qtopia2.2.0

相比,它的功能较弱,例如没有中文的支持、没有整合“友善之臂”程序组等等。

Page 14: Mini6410 Qt4和Qtopia编程开发指南

第 - 14 - 页

3.2.1 获得 qtopia2.2.0 的源代码

参考章节 3.2 在 FriendlyARM mini6410 光盘 A的以下路径“开发文档和教程\01 Qt4和 Qtopia

编 程 开 发 指 南 \ 源 代 码 \ 第 三 章 \3-2 ” 可 以 拿 到 Qtopia2.2.0 源 代 码 的 原 始 包

qtopia-free-src-2.2.0.tar.gz,将其拷贝到 /opt 下,然后在 linux 终端上输入如下命令(不用键

入#),在/opt/下解压 Qtopia2.2.0 的源码包:

# cd /opt

# tar xvzf qtopia-free-src-2.2.0.tar.gz

3.2.2 编译 PC 版本的 qtopia2.2.0

3.2.2.1 初次编译

在 linux终端上输入以下命令开始编译 Qtopia2.2.0 的 x86版本,编译分为两个部分,configure

和 make:

# cd /opt/qtopia-free-2.2.0/

# echo yes | ./configure -qte '-embedded -no-xft -qconfig qpe -depths 16,32 -system-jpeg

-gif' -qpe '-edition pda -displaysize 240x320' -qt2 '-no-opengl -no-xft' -dqt '-no-xft

-thread'

# make

make执行到半途会出现编译错误,如下所示:

/opt/qtopia-free-2.2.0/qt2/include/qwindowsystem_qws.h:214: 警 告 : 此 声 明 中 的

typedef 被忽略

/opt/qtopia-free-2.2.0/qt2/include/qwindowsystem_qws.h:230: 错 误 :

‘QWSInputMethod’未声明

/opt/qtopia-free-2.2.0/qt2/include/qwindowsystem_qws.h:237: 错 误 :

‘QWSGestureMethod’未声明

make[1]: *** [allmoc.o] 错误 1

这是由于 Qtopia2.2.0是几年前的产品,而 Fedora9 自带的 gcc 4.3编译器较新已经不支持旧的

一些 C/C++语法特性导致的,因此需要修改源代码才能顺利编译通过,由于错误的地方太多,这里就

Page 15: Mini6410 Qt4和Qtopia编程开发指南

第 - 15 - 页

不一一展示如何修改了,我用 diff命令将修改的部分制作成 patch, 读者可以直接通打 patch 的方式

来修复这些错误,如果你想了解 patch 到底修复了哪些错误,可以直接用文本编辑器查看 patch 文件

来了解。

3.2.2.2 通过打 patch 来修复编译错误

从光盘上找到文件 qtopia2.2.0.friendlyarm.patch(位于光盘 A 的“开发文档和教程\01 Qt4

和 Qtopia 编程开发指南\源代码\第三章\3-2”目录下), 然后复制到 /opt 下,输入以下命令,将

patch 应用原始的 qtopia 2.2.0

# cd /opt/qtopia-free-2.2.0

# patch -p1 < /opt/qtopia2.2.0.friendlyarm.patch

打完 patch 后,输入以下命令重新编译:

# echo yes | ./configure -qte '-embedded -no-xft -qconfig qpe -depths 16,32

-system-jpeg -gif' -qpe '-edition pda -displaysize 240x320' -qt2 '-no-opengl

-no-xft' -dqt '-no-xft -thread'

# make

# make install

configure配置参数的含义通过命令 ./configure --help 来了解其含义。

3.2.2.3 在 PC 上运行 qtopia2.2.0

要运行 qtopia2.2.0,首先需要运行 Qtopia 模拟器 qvfb, 还需要设置 QTDIR 等一些环境变量,

为了方便在 PC 上运行 qtopia2.2.0, 我编写了一个 qtopia2.2.0运行脚本 run,run 编写如下所示:

# cd /opt/qtopia-free-2.2.0

# vi run

在 vi中输入以下内容保存:

#!/bin/sh

Page 16: Mini6410 Qt4和Qtopia编程开发指南

第 - 16 - 页

./qt2/bin/qvfb -width 480 -height 272 -depth 16 &

cd qtopia/image

mkdir root 2>/dev/null || true

export HOME=$PWD/root

cd opt/Qtopia

export PATH=$PWD/bin:$PATH

export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBARAY_PATH

export QTDIR=$PWD

export QPEDIR=$PWD

export KDEDIR=$PWD/../kde

sleep 3

qpe

然后执行以下命令运行 qtopia 模拟器:

# chmod +x ./run

# ./run

qtopia2.2.0效果如下图所示:

下面的章节将介绍如何编译在 mini6410 上运行的 qtopia2.2.0。

Page 17: Mini6410 Qt4和Qtopia编程开发指南

第 - 17 - 页

3.2.3 编译 mini6410 版本的 qtopia2.2.0

3.2.3.1 交叉编译 qtopia 2.2.0

为了避免与 x86版本的 qtopia 2.2.0 产出冲突,我们创建一个新目录 mini6410 来存放 arm 版本

的 qtopia, 如下所示:

# mkdir /opt/mini6410

然后执行以下命令将 qtopia2.2.0 的源代码上述目录上解压并打上 patch:

# cd /opt/mini6410

# tar xvzf /opt/qtopia-free-src-2.2.0.tar.gz

# cd /opt/mini6410/qtopia-free-2.2.0

# patch -p1 < /opt/qtopia2.2.0.friendlyarm.patch

接着执行编译前的配置:

# echo yes | ./configure -qte '-embedded -no-xft -qconfig qpe -depths 16,32

-system-jpeg -qt-zlib -qt-libpng -gif -no-g++-exceptions -no-qvfb -xplatform

linux-arm-g++ -tslib' -qpe '-edition pda -displaysize 480x272 -xplatform

linux-arm-g++ -luuid' -qt2 '-no-opengl -no-xft' -dqt '-no-xft -thread'

在上面 configure 参数中,我们指定使用了 tslib 来驱动触摸屏,在友善之臂的 linux 交叉编

译器中,已经包含了 tslib 的库文件和头文件,因此这里不需要指定 tslib 的库文件和头文件路径。

其它的配置参数的含义通过命令 ./configure --help 来了解其含义。

最后执行以下命令进行编译及安装:

# make

# make install

编译成功后,编译生成的 image存放在/opt/mini6410/qtopia-free-2.2.0/qtopia/image 目录下。

3.2.3.2 在 mini6410 开发板上运行 qtopia2.2.0

先确认你的 mini6410 已经参考用户手册烧写了最新版本的 linux images。然后执行以下命令,

将刚刚我们编译产出的 image 打包,然后拷贝到你的 sd卡上。

Page 18: Mini6410 Qt4和Qtopia编程开发指南

第 - 18 - 页

# cd /opt/mini6410/qtopia-free-2.2.0/qtopia/image

# tar cvzf opt.tgz opt

然后打开 minicom, 开启 mini6410开发板,在 minicom输入(我用@#来表示 minicom上的提示符,

用#表示 PC上的终端提示符,在输入时注意不用输入它们):

@# killall qpe qss quicklauncher

@# rm /opt -rf

@# tar xvzf /sdcard/opt.tgz

创建一个脚本 run_my_qtopia,用于运行我们自已编译的 Qtopia:

@# vi /bin/run_my_qtopia

在 run_my_qtopia中输入如下内容:

#!/bin/sh

export TSLIB_TSDEVICE=/dev/touchscreen-1wire

export TSLIB_CONFFILE=/etc/ts.conf

export TSLIB_PLUGINDIR=/usr/lib/ts

export TSLIB_CALIBFILE=/etc/pointercal

export QTDIR=/opt/Qtopia

export QPEDIR=/opt/Qtopia

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH

export QWS_MOUSE_PROTO="TPanel:/dev/input/mice"

export QWS_KEYBOARD=TTY:/dev/tty1

export HOME=/root

exec $QPEDIR/bin/qpe

上述的 run_my_qtopia运行脚本说明如下:

a) 首先,我们需要根据我们使用的触摸屏,配置 tslib 的参数,其中,TSLIB_TSDEVICE 环境变

量指向触摸屏的设备文件,需要根据你所用的触摸屏设置成以下的值之一:

一线触摸屏使用:TSLIB_TSDEVICE=/dev/touchscreen-1wire

ADC 触摸屏使用:TSLIB_TSDEVICE=/dev/touchscreen

串口触摸屏使用:TSLIB_TSDEVICE=/dev/ttySAC3

(注:2010-11-21 以后购买的开发板都是用一线触摸屏的,如果在这之前购买的,则就有可能是 ADC

或者串口触摸屏)

Page 19: Mini6410 Qt4和Qtopia编程开发指南

第 - 19 - 页

b) 然后,配置 Qtopia 的环境变量 QTDIR, QPEDIR 指向 Qtopia Image 的路径,配置

QWS_MOUSE_PROTO 指向触摸屏设备, QWS_KEYBOARD 指向开发板上用于 Hard Key 的 tty 设备。

c) 最后,执行 qpe 可执行文件,启动 Qtopia。

输入以下命令为 run_my_qtopia 设置可执行权限,然后修改 /etc/init.d/rcS 文件,让系统启动

时,自动启动我们自已编译的 Qtopia:

@# chmod +x /bin/run_my_qtopia

@# vi /etc/init.d/rcS

把文件中的:

/bin/qtopia &

改成:

/bin/run_my_qtopia &

然后重启开发板,将开机自动启动我们自已 build的 Qtopia2.2.0。

3.3 移植 Qt4.7 到 mini6410

本章节将带领读者一起将目前最新版本的 Qt4.7.0 移植到 mini6410 开发板上运行,其间会讲解

如何交叉编译 Qt4.7.0和其自带的示例程序,并将它们在 mini6410上运行。

本章节中会用到如下软件包,请先在光盘 A上找到以下软件包和工具:

文件名 光盘路径 说明

qt-everywhere-opensource-src-4.7.0.tar.gz 开发文档和教程

\01 Qt4 和

Qtopia 编程开

发指南\源代码\

第三章\3-3

Qt4.7.0官方源代码

Page 20: Mini6410 Qt4和Qtopia编程开发指南

第 - 20 - 页

3.3.1 获得 Qt4.7 的源代码

在 mini6410光盘 A 的以下路径“开发文档和教程\01 Qt4 和 Qtopia 编程开发指南\源代码\第三

章\3-3”可以拿到 Qt4.7.0 源代码的原始包 qt-everywhere-opensource-src-4.7.0.tar.gz,将其拷

贝到 /opt 下,然后在 linux 终端上输入如下命令(不用键入#),在/opt/mini6410 下解压 Qt4.7.0

的源码包:

# cd /opt/mini6410

# tar xvzf /opt/qt-everywhere-opensource-src-4.7.0.tar.gz

(注:如果还没有创建 /opt/mini6410 目录,请输入 mkdir –p /opt/mini6410 创建。)

3.3.2 交叉编译 Qt4.7

执行以下命令执行 Qt4.7.0 编译前的配置:

# /opt/mini6410/qt-everywhere-opensource-src-4.7.0

# echo yes | ./configure -prefix /opt/Qt4.7 -opensource -embedded arm -xplatform

qws/linux-arm-g++ -no-webkit -qt-libtiff -qt-libmng -qt-mouse-tslib

-qt-mouse-pc -no-mouse-linuxtp -no-neon

上面的主要参数含义说明如下:

-embedded arm: 表示将编译针对 arm平台的 embedded 版本;

-xplatform qws/linux-arm-g++: 表示使用 arm-linux 交叉编译器进行编译;

-qt-mouse-tslib: 表示将使用 tslib 来驱动触摸屏;

-prefix /opt/Qt4.7: 表示 Qt4.7 最终的安装路径是 /opt/Qt4.7 ,注意,部置到 mini6410 开

发板时,也需要把 Qt4.7放在这个路径上;

执行以下命令进行编译并安装 Qt4.7:

# make && make install

上面命令中出现的&&符号表示只有左边的 make 命令执行成功时(返回 0),才会执行右边的 make

install命令。

编译完成后,Qt4.7 被安装在 /opt/Qt4.7 目录下。

Page 21: Mini6410 Qt4和Qtopia编程开发指南

第 - 21 - 页

3.3.3 在 mini6410 上部置 Qt4.7

在 PC上执行如下命令将 Qt4.7打包:

# cd /opt

# tar cvzf qt4.7.tgz Qt4.7

打包完成后,将 qt4.7.tgz 拷贝到 SD 卡, 然后将 SD 卡插入 mini6410 开发板,执行以下命令将 qt4.7.tgz

解压到开发板上的/opt 目录下:

@# rm /usr/local/Trolltech/QtEmbedded-4.7.0-arm/ -rf

@# cd /opt

@# tar xvzf /sdcard/qt4.7.tgz

(注:在上述命令中,为了保证有足够的空间存放我们自已编译的Qt4.7, 我们先将友善之臂提供的Qt4.7

删除掉)

注意,一定要保持 Qt4.7 的目录为 /opt/Qt4.7, 因为我们在配置 Qt4.7 时,指定了-prefix 参数为

/opt/Qt4.7 。

至此,Qt4.7 在 mini6410 上部署完成了,接下来我们将运行一个示例程序来测试 Qt4.7 是否能正常工

作。

3.3.4 在 mini6410 上运行 Qt4.7 的示例程序

在运行任何 Qt4.7 程序之前,需要先退出 Qtopia2.2.0 或者 Qt-Extended4.4.3 等一切 Qt 程序,退出

Qtopia2.2.0 的方法是:在 Qtopia2.2.0 中点“设置”中的“关机”可出现如下界面,点“Terminate Server”

即可关闭 Qtopia-2.2.0 系统。

Page 22: Mini6410 Qt4和Qtopia编程开发指南

第 - 22 - 页

也可以使用其他的方法,比如在启动脚本/etc/init.d/rcS 中注释掉 qtopia 启动项,再重新系统系统;或

者使用 killall 命令杀死相关的进程(比较多);甚至是直接删除/opt 目录中的所有内容重启。

如何运行 Qt4.7 的示例程序呢?

在我们部署到 mini6410 开发板上的 Qt4.7 的/opt/Qt4.7/examples/目录就带有不少的示例程序,并且已

经编译好生成有可执行文件,我们试着直接运行一个程序试试:

@# /opt/Qt4.7/demos/embedded/fluidlauncher/fluidlauncher

程序没法运行,提示有错误,原因是 Qt4.7 的环境没有设置好,为了更方便地运行 Qt4 程序,我们先

编写一个脚本 setqt4env,这个脚本用于设置 Qt4.7 所需要的环境变量。

输入以下命令创建并编写脚本 /bin/setqt4env :

@# vi /bin/setqt4env

在 vi 编辑器中输入如下内容:

#!/bin/sh

if [ -e /etc/friendlyarm-ts-input.conf ] ; then

. /etc/friendlyarm-ts-input.conf

fi

true ${TSLIB_TSDEVICE:=/dev/touchscreen}

TSLIB_CONFFILE=/etc/ts.conf

export TSLIB_TSDEVICE

export TSLIB_CONFFILE

export TSLIB_PLUGINDIR=/usr/lib/ts

export TSLIB_CALIBFILE=/etc/pointercal

export QWS_DISPLAY=:1

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

export PATH=/bin:/sbin:/usr/bin/:/usr/sbin:/usr/local/bin

if [ -c /dev/touchscreen ]; then

export QWS_MOUSE_PROTO="Tslib MouseMan:/dev/input/mice"

if [ ! -s /etc/pointercal ] ; then

rm /etc/pointercal

/usr/bin/ts_calibrate

fi

else

export QWS_MOUSE_PROTO="MouseMan:/dev/input/mice"

fi

export QWS_KEYBOARD=TTY:/dev/tty1

Page 23: Mini6410 Qt4和Qtopia编程开发指南

第 - 23 - 页

export HOME=/root

将脚本设置可执行权限:

@# chmod +x /bin/setqt4env

现在再试一下运行示例程序:

@# . setqt4env

@# cd /opt/Qt4.7/demos/embedded/fluidlauncher/

@# ./fluidlauncher -qws

上面的命令中,先调用 setqt4env 设置一下环境变量,再调用示例程序,注意,setqt4env 命令前面的

“.”与 setqt4env 之间要有一个空格隔开,表示脚本中导出的环境变量将应用到当前 shell 会话中。

示例程序的运行结果如下:

3.4 移植 Qt-Extended 4.4.3 (Qtopia4.4.3) 到 mini6410

本章节将讲解如何编译和移植 Qt-Extended4.4.3,包括如何编译 PC 版本以及 arm 版本,并最终

将它部署到 mini6410 上运行。

本章节中会用到如下软件包,请先在光盘 A上找到以下软件包和工具:

Page 24: Mini6410 Qt4和Qtopia编程开发指南

第 - 24 - 页

文件名 光盘路径 说明

qt-extended-opensource-src-4.4.3.tar.gz 开发文档和教程

\01 Qt4 和

Qtopia 编程开发

指南\源代码\第

三章\3-4

Qt-Extended4.4.3 源代码

3.4.1 获得并安装 Qt-Extended4.4.3 源代码

在 FriendlyARM mini6410 光盘 A的以下路径“开发文档和教程\01 Qt4和 Qtopia 编程开发指南\

源 代 码 \ 第 三 章 \3-4 ” 可 以 拿 到 Qt-Extended4.4.3 源 代 码 的 压 缩 包

qt-extended-opensource-src-4.4.3.tar.gz,将其拷贝到 /opt 下备用。

我们将创建/opt/mini6410/qt-extended4.4.3 目录, 用作 Qt-Extended4.4.3 的工作目录,在接

下的 PC 版本及 ARM 版本的编译工作中,都将在这个目录上进行, 在 linux 终端上输入如下命令(不

用键入#),在/opt/mini6410/qt-extended4.4.3下解压 Qt-Extended4.4.3 的源码包:

# mkdir -p /opt/mini6410/qt-extended4.4.3

# cd /opt/mini6410/qt-extended4.4.3

# tar xvzf /opt/qt-extended-opensource-src-4.4.3.tar.gz

3.4.2 编译和运行 x86 版本的 Qt-Extended-4.4.3

3.4.2.1 配置并编译 x86 版本

我们需要创建一个 build 目录专门存放编译 x86 版本时产出的临时文件,以及最终编译生成的

image 也会存放于这个目录,用下列命令创建目录:

# mkdir -p /opt/mini6410/qt-extended4.4.3/buildx86

输入以下命令,执行编译前的配置:

# export LC_CTYPE="en_US"

# export LANG="en_US"

# export LANGUAGE="en_US"

Page 25: Mini6410 Qt4和Qtopia编程开发指南

第 - 25 - 页

# cd /opt/mini6410/qt-extended4.4.3/buildx86

# echo yes | ../qt-extended-4.4.3/configure \

-ui-type mobile \

-release \

-clean \

-sound-system alsa \

-build-qt \

-no-sxe \

-no-ssl \

-no-v4l2 \

-no-vpn \

-no-phonon \

-no-libamr \

-dynamic-rotation \

-mediaengines cruxus \

-remove-mediaengine gstreamer,helix \

-pictureflow \

-remove-module bluetooth,drm \

-no-dbus \

-no-dbusipc \

-add-displaysize 240x320 \

-extra-qt-embedded-config "-qt-freetype -no-webkit -no-dbus

-qt-gfx-transformed -qt-gfx-linuxfb" \

-extra-qt-config "-no-webkit" \

2>&1 | tee ../qtopiaconfig.log

在上面的配置命令后,我们首先将语言设置为 en_US, 原因是由于 Fedora9 终端默认的语言编码为

zh_CN.UTF-8 或者 en_US.UTF-8,而 perl 在 UFT8 下会有问题,Qt-Extended4.4.3 的编译脚本使用了 perl,

所以先将语言改成 en_US,否则会出现很多莫名其妙的编译错误,脚本参数中的其它编译配置参数请输入

“../qt-extended-4.4.3/configure –help”了解其含义。

接下来输入以下命令进行编译和安装:

# bin/qbuild 2>&1 | tee ../qtopiamake.log

# bin/qbuild image

(注:命令后跟的 2>&1 | tee ../XXX.log 不是必须的,这一串命令参数的含义时,将编译过程中的所有

Page 26: Mini6410 Qt4和Qtopia编程开发指南

第 - 26 - 页

的输出信息同时输出到屏幕和 log 文件中)

3.4.2.2 运行 PC 版本的 Qt-Extended4.4.3

Qt-Extended4.4.3 自带了用于运行的脚本 runqtopia,因为只要执行以下命令即可运行 Qt-Extended4.4.3:

# cd /opt/mini6410/qt-extended4.4.3/buildx86

# bin/runqtopia

Qt-Extended4.4.3 的运行结果如下所示:

3.4.3 编译和运行 arm 版本的 Qt-Extended-4.4.3

3.4.3.1 配置并编译 arm 版本

我们需要创建一个 buildarm 目录专门存放编译 arm 版本时产出的临时文件(.o, .moc,Makefile

等等),最终编译生成的 image 也会存放于这个目录,用下列命令创建目录:

# mkdir -p /opt/mini6410/qt-extended4.4.3/buildarm

输入以下命令,执行编译前的配置:

Page 27: Mini6410 Qt4和Qtopia编程开发指南

第 - 27 - 页

# export LC_CTYPE="en_US"

# export LANG="en_US"

# export LANGUAGE="en_US"

# cd /opt/mini6410/qt-extended4.4.3/buildarm

# echo yes | ../qt-extended-4.4.3/configure \

-ui-type mobile \

-xplatform linux-arm-g++ \

-arch arm \

-release \

-clean \

-prefix /opt/Qtopia4.4.3 \

-sound-system oss \

-build-qt \

-no-sxe \

-no-ssl \

-no-v4l2 \

-no-vpn \

-no-phonon \

-no-libamr \

-dynamic-rotation \

-mediaengines cruxus \

-remove-mediaengine gstreamer,helix \

-pictureflow \

-remove-module bluetooth,drm \

-no-dbus \

-no-dbusipc \

-add-displaysize 240x320 \

-extra-qt-embedded-config "-embedded arm -xplatform qws/linux-arm-g++

-no-cups -nomake examples -nomake demos -qt-libjpeg -qt-libmng -qt-libpng

-no-dbus -depths 16,32 -qt-gfx-linuxfb -qt-gfx-transformed -no-gfx-qvfb

-no-gfx-vnc -no-gfx-multiscreen -qt-kbd-tty -no-kbd-usb -no-kbd-sl5000

-no-kbd-yopy -no-kbd-vr41xx -no-kbd-qvfb -qt-mouse-tslib -no-webkit -no-openssl

-no-phonon -no-phonon-backend -no-nas-sound -no-exceptions -svg" \

-extra-qt-config "-no-webkit" \

2>&1 | tee ../qtopiaconfig.log

在上面的配置命令后,我们首先将语言设置为 en_US, 原因是由于 Fedora9 终端默认的语言编码为

zh_CN.UTF-8 或者 en_US.UTF-8,而 perl 在 UFT8 下会有问题,Qt-Extended4.4.3 的编译脚本使用了 perl,

所以先将语言改成 en_US,否则会编译错误。

其它编译配置参数请输入“../qt-extended-4.4.3/configure –help”了解其含义。

Page 28: Mini6410 Qt4和Qtopia编程开发指南

第 - 28 - 页

由于我们所用的编译器较新,有一些代码语法可能已经不兼容了,所以在编译之前需要先修改一个源

文件,否则如果直接编译,会出现以下编译错误:

/opt/mini6410/qt-extended4.4.3/qt-extended-4.4.3/src/libraries/qtopia/qphoneprofile.cpp:1026:1:

error: 'QPhoneProfile::Schedule::Schedule' names the constructor, not the type

为了修正上述的编译错误,请用 vi 打开 qphoneprofile.cpp,定位到 1026 行,将其中的

QPhoneProfile::Schedule::Schedule &QPhoneProfile::Schedule::operator=(const Schedule &other)

改成

QPhoneProfile:: Schedule &QPhoneProfile::Schedule::operator=(const Schedule &other)

接着进行编译和安装:

# bin/qbuild 2>&1 | tee ../qtopiamake.log

# bin/qbuild image

出 现 Qt Extended has been installed. 表 示 已 经 成 功 编 译 , 编 译 生 成 的 image 将 放 在

/opt/mini6410/qt-extended4.4.3/buildarm/image 目录下。

3.4.3.2 在开发板上部置 Qt-Extended-4.4.3

先确认你的 mini6410 烧写了最新版本的 linux images,然后执行以下命令,将刚刚我们编译产

出的 image 打包:

# cd /opt/mini6410/qt-extended4.4.3/buildarm/

# tar cvzf image.tgz image

将 image 拷贝到你的 sd 卡上,然后打开 minicom, 开启 mini6410 开发板,在 minicom 输入以下

命令,将 image 解压到/opt 目录下,并将目录名改名为 Qtopia4.4.3,由于 FriendlyARM 已经提供了

Qtopia4.4.3,所以我们首先将它删除,然后替换成我们自已编译的:

@# rm /opt/Qtopia4.4.3 -rf

@# cd /opt

@# tar xvzf /sdcard/image.tgz

@# mv /opt/image /opt/Qtopia4.4.3

Page 29: Mini6410 Qt4和Qtopia编程开发指南

第 - 29 - 页

3.4.3.3 在开发板上运行 Qt-Extended-4.4.3

在运行任何 Qt-Extended4.4.3 程序之前,需要先退出 Qtopia2.2.0 或者 Qt4 程序 等一切

Qt 程序,退出 Qtopia2.2.0 的方法是:在 Qtopia2.2.0 中点“设置”中的“关机”可出现如下

界面,点“Terminate Server”即可关闭 Qtopia-2.2.0 系统。

也可以使用其他的方法,比如在启动脚本/etc/init.d/rcS 中注释掉 qtopia 启动项,再重新系统

系统;或者使用 killall 命令杀死相关的进程(比较多;甚至是直接删除/opt 目录中的所有内容

重启。

为了更方便地运行 Qtopia, 我们先创建一个脚本 run_my_qtopia4,用于运行我们自已编译的

Qtopia4:

@# vi /bin/run_my_qtopia4

在 run_my_qtopia4中输入如下内容:

Page 30: Mini6410 Qt4和Qtopia编程开发指南

第 - 30 - 页

#!/bin/sh

if [ -e /etc/friendlyarm-ts-input.conf ] ; then

. /etc/friendlyarm-ts-input.conf

fi

true ${TSLIB_TSDEVICE:=/dev/touchscreen}

TSLIB_CONFFILE=/etc/ts.conf

export TSLIB_TSDEVICE

export TSLIB_CONFFILE

export TSLIB_PLUGINDIR=/usr/lib/ts

export TSLIB_CALIBFILE=/etc/pointercal

export QTDIR=/opt/Qtopia4.4.3

export QPEDIR=/opt/Qtopia4.4.3

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH

if [ -c /dev/touchscreen ]; then

export QWS_MOUSE_PROTO="Tslib:${TSLIB_TSDEVICE}"

if [ -e /etc/pointercal -a ! -s /etc/pointercal ] ; then

rm /etc/pointercal

fi

else

export QWS_MOUSE_PROTO="USB:/dev/input/mice"

>/etc/pointercal

fi

export QWS_KEYBOARD="TTY:/dev/tty1"

#export QWS_DISPLAY="Transformed:mmWidth66:mmHeight114:Rot90:0"

FB_SIZE=$(cat /sys/class/graphics/fb0/virtual_size)

case "$FB_SIZE" in

800,480)

Page 31: Mini6410 Qt4和Qtopia编程开发指南

第 - 31 - 页

export QWS_DISPLAY="LinuxFb:mmWidth91:mmHeight53:1"

;;

480,272)

export QWS_DISPLAY="LinuxFb:mmWidth76:mmHeight44:1"

;;

*)

export QWS_DISPLAY="LinuxFb:mmWidth91:mmHeight53:1"

;;

esac

export LANG="en_US"

export HOME=/root/Qtopia4Home

if [ ! -e $HOME ]; then mkdir -p $HOME; fi

if [ ! -e /usr/share ]; then mkdir /usr/share; fi

if [ ! -e /usr/share/zoneinfo ]; then ln -s /opt/Qtopia/etc/zoneinfo /usr/share/;

fi

if [ ! -e $HOME/Settings/Trolltech/qpe.conf ]; then

mkdir -p $HOME/Settings/Trolltech/

cp $QPEDIR/etc/default/Trolltech/qpe.conf $HOME/Settings/Trolltech/qpe.conf

-f

fi

export QTOPIA_PHONE_DUMMY=1

exec $QPEDIR/bin/qpe

run_my_qtopia4运行脚本说明如下:

a) 首先,我们需要根据我们使用的触摸屏,配置 tslib的参数。

b) 然后,配置 Qtopia 的环境变量 QTDIR, QPEDIR 指向 Qtopia Image 的路径,配置

QWS_MOUSE_PROTO 指向触摸屏设备, QWS_KEYBOARD 指向开发板上用于 Hard Key 的 tty 设备。

c) 配置 QWS_DISPLAY 环境变量设置 LCD显示参数,根据屏幕分辨率的不同,设置不同的 DPI,使

文字大小的显示适中。

d) 由于 mini6410没有GSM Modem, 所以设置 QTOPIA_PHONE_DUMMY=1表示使用虚拟的modem设备。

e) 最后,执行 qpe 可执行文件,启动 Qtopia。

Page 32: Mini6410 Qt4和Qtopia编程开发指南

第 - 32 - 页

为 run_my_qtopia4 设置可执行权限,然后修改 /etc/init.d/rcS 文件,让系统启动时,自动启

动我们自已编译的 Qtopia:

@# chmod +x /bin/run_my_qtopia4

@# vi /etc/init.d/rcS

把文件中的:

/bin/qtopia &

改成:

/bin/run_my_qtopia4 &

然后重启开发板,应该可以看到我们自已 build的 Qt-Extended4.4.3 了,运行效果如下所示:

Page 33: Mini6410 Qt4和Qtopia编程开发指南

第 - 33 - 页

第四章 mini6410 上的应用程序开发示例

4.1 开发第一个 qtopia2.2.0 程序

4.1.1 本示例的设计目的

本章节将介绍如何创建一个简单的 Qtopia2.2.0 程序,并将其集成到 Qtopia2.2.0 中,我们将以

一个简单的计算器作为例子,演示开发一个 Qtopia2.2.0 应用程序的完整步骤,包括使用 designer 设

计图形程序界面、交叉编译 arm 版本的程序等等,为了简单,本示例所编写的计算器只提供加法功能,

功能界面如下所示:

下面的章节将一步步演示如何构造这个程序,在这开始之前,我们先创建一个 qtopia2_apps 目

录,用于专门存放我们自已编写的 qtopia2.2.0 程序, 在 Linux 终端中键入以下命令创建该目录:

# mkdir -p /opt/qtopia2_apps

然后在 qtopia2_apps 目录下创建 mycalc 作为本示例的项目目录,在终端上输入如下命令:

# cd /opt/qtopia2_apps

# mkdir mycalc

Page 34: Mini6410 Qt4和Qtopia编程开发指南

第 - 34 - 页

4.1.2 使用 designer 工具设计图形界面

Qt/Qtopia 都带有 designer 工具,可以设计所见即所得的图形界面,我们现在就使用 designer 工

具来设计 mycalc 程序的主界面,主界面将保存成名为 main_form_base.ui 的 ui 文件1,输入如下命

令启动 designer 工具,并以 ui 文件名作为参数:

# cd mycalc

# /opt/mini6410/qtopia-free-2.2.0/qt2/bin/designer main_form_base.ui

在弹出的 New Form 界面中,选择“Widget”然后点击”OK“,我们将创建一个基于 QWidget 的窗

体而不是 QDialog 或其它:

这时,将会显示窗口的编辑画面,我们需要修改窗口的大小,使得 3.5 寸的屏幕也能完整显示我

们的程序,并且需要修改窗口标题, 请参考下图的提示修改窗口的属性值:

1 Designer 工具所生成的.ui 文件在编译时会被 uic 编译器解析,并生成 C++代码。

Page 35: Mini6410 Qt4和Qtopia编程开发指南

第 - 35 - 页

4.1.2.1 在窗体上放置控件

修改完窗口的属性值后,接下来我们就要在窗口上放置控件了,往窗口上放置控件的方法是:在

工具栏上点击要放置的控件,再在窗口空白处点击一下即可。

根据我们最初的设计思路,我们需要在窗口上放置以下控件:

1) 二个 Button(按钮): 一个是“=”,用于点击时计算结果,一个是“Close”,用于退出程序。

2) 三个 Line Edit(单行文本框): 两个用于输入要执行加法运算的数字,另一个用于显示计算结果。

3) 一个 Label(文本标签):用于显示加号。

请参考下图放置上面列出的控件,控件的工具栏图标在下图中我已经以红色方框标记出来了:

Page 36: Mini6410 Qt4和Qtopia编程开发指南

第 - 36 - 页

放置完控件之后,我们将 Label 文本标签上的文字改为“+”,修改方法是双击 Label 文本标签,然

后在弹出的编辑框上输入“+”即可; 用同样的方法修改两个按钮上的文字,将两个按钮上的文字一个修

改成“=”, 一个修改成”Close”。

修改完控件上文字之后,按照上图的位置摆放控件,在摆放之前,需要适当地调整控件的大小,

调整控件大小的方法是,先单击要调整的控件,然后在控件的边框上的小黑框上单击拖动即可。

4.1.2.2 修改控件属性

我们还需要设置一些控件的属性,主要是修改文本框的实例名称,这样在代码里面可以方便引用

它们,修改方法是点击左边的文本框控件,在右边的属性窗口进行修改,请按下图的指示修改三个文

本编辑控件的属性,三个文本框的实例名称分别被修改成 m_x, m_y 和 m_result:

Page 37: Mini6410 Qt4和Qtopia编程开发指南

第 - 37 - 页

Page 38: Mini6410 Qt4和Qtopia编程开发指南

第 - 38 - 页

4.1.2.3 为按钮添加点击事件的处理

最后还要给按钮添加点击事件的处理,我们首先需要新建两个 slot 函数,一个用于处理“=”按

钮的点击事件,一个用于处理 Close 按钮的点击事件,新建 slot 的步骤如下:

1) 点击”Edit”菜单,选择“Slots”,将弹出如下所示的 slot 编辑对话框:

Page 39: Mini6410 Qt4和Qtopia编程开发指南

第 - 39 - 页

2) 在上面的对话框中,点击”New Slot“按钮, 然后在 Slot 编辑框中输入“calcButtonClicked()”,

如下图所示:

3) 然后再点”New Slot“按钮,并在 Slot 编辑框中输入“closeButtonClicked()”, 如下图所示,

最后点击 OK 保存并退出该对话框:

至此,slot 添加完毕,现在将 slot 函数与按钮的点击事件对应起来:

4) 单击工具栏上的 Connect Signal/Slots 图标 ,然后参照下图所示进行操作,在“=”按

钮上按下鼠标左键不放然后拖动到窗口的空白处放开鼠标,操作完成后将会弹出 Edit

Connects 对话框:

Page 40: Mini6410 Qt4和Qtopia编程开发指南

第 - 40 - 页

5) 在弹出的 Edit Connects 对话框中,将 clicked()事件连接到 calcButtonClicked() slot 函数,

操作方法如下图所示:

6) 下面用同样的方法操作 Close 按钮,参照下图所示进行操作:

Page 41: Mini6410 Qt4和Qtopia编程开发指南

第 - 41 - 页

7) 最后,如下图所示将 Close 按钮的 clicked()事件连接到 closeButtonClicked() slot 函数:

至此,界面设计完毕,可以进入写代码环节了。

Page 42: Mini6410 Qt4和Qtopia编程开发指南

第 - 42 - 页

4.1.3 编写代码

界面设计完,现在开始为 mycalc 编写代码,我们需要创建三个源代码文件,一个是头文件

main_form.h,一个是源代码文件 main_form.cpp,一个是 main.cpp,分别在以下章节中创建这些文

件:

4.1.3.1 编写程序入口 main.cpp

首先用 vi 编辑器创建并打开 main.cpp 文件:

# vi main.cpp

在 vi 编辑器中输入如下源代码内容:

#include "main_form.h"

#include <qtopia/qpeapplication.h>

QTOPIA_ADD_APPLICATION("mycalc”,TMainForm)

QTOPIA_MAIN

main.cpp 只有 4 行源代码,它的实现很简单,宏展开后会是一个 main 函数,然后创建

QPEApplication 对象 和 TMainForm 主窗口对象,最后显示主窗口并执行 QApplication::exec()进入

事件循环。

main.cpp 所用到的头文件 main_form.h 和 TMainForm 类到目前为止还不存在,我们接下来就要

新建它们。

4.1.3.2 编写主窗口头文件 main_form.h

接下来用 vi 编辑器创建并打开 main_form.h 文件:

# vi main_form.h

在 vi 编辑器中输入如下源代码内容:

#if !defined (__MAIN_FORM_H__)

# define __MAIN_FORM_H__

#include "main_form_base.h"

#include <qsocketnotifier.h>

Page 43: Mini6410 Qt4和Qtopia编程开发指南

第 - 43 - 页

class TMainForm: public TMainFormBase {

Q_OBJECT

public:

TMainForm(QWidget * parent = 0, const char * name = 0, WFlags f = WType_TopLevel) :

TMainFormBase(parent,name,f) {}

virtual ~TMainForm() {}

public slots:

void calcButtonClicked();

void closeButtonClicked();

};

#endif

main_form.h 文件中包含了 main_form_base.h 头文件,这个 main_form_base.h 头文件不需要

用户编写,编译时由 uic 编译器根据 main_form_base.ui 文件自动生成的。

在自动生成的 main_form_base.h 头文件,是 Qt 自带的 uic 编译器由 main_form_base.ui 转换

成的 C++程序代码,这部分代码实现了界面的基类 TMainFormBase, 并定义了相关的 slot 函数,因

此,要使用我们自已用 designer 设计的程序界面,我们只需将主窗口 TMainForm 从 TMainFormBase

类继承即可,由于我们接下来要编写按钮功能的代码,所以我们还需要重载 calcButtonClicked() 和

closeButtonClicked() 函数。

4.1.3.3 编写主窗口源文件 main_form.cpp

接下来用 vi 编辑器创建并打开 main_form.cpp 文件:

# vi main_form.cpp

在 vi 编辑器中输入如下源代码内容:

#include "main_form.h"

#include <qlineedit.h>

void TMainForm::calcButtonClicked()

{

m_result->setText( "" );

if (m_x->text().isEmpty() || m_y->text().isEmpty()) {

return ;

}

Page 44: Mini6410 Qt4和Qtopia编程开发指南

第 - 44 - 页

bool ok = false;

int x = m_x->text().toInt(&ok);

if (!ok) {

m_x->setText("");

return ;

}

ok = false;

int y = m_y->text().toInt(&ok);

if (!ok) {

m_y->setText("");

return ;

}

m_result->setText( QString::number( x + y ) );

}

void TMainForm::closeButtonClicked()

{

close();

}

上述源代码主要实现了 calcButtonClicked() 和 closeButtonClicked() 这两个 slot 函数,

closeButtonClicked 比较简单,直接调用基类的 close() 函数关闭窗口即可退出程序,而

calcButtonClicked 函数则取 m_x 和 m_y 这两个文本框的值,然后相加将结果放到 m_result 文本框

中,其间进行了一些容错处理,比如如果用户输入的不是数字,则拒绝计算结果并清空该文本框。

4.1.3.4 编写项目文件 mycalc.pro

源代码写完了,在编译之前,还得再写一个 mycalc.pro 项目文件。

接下来用 vi 编辑器创建并打开 mycalc.pro 文件:

# vi mycalc.pro

在 vi 编辑器中输入如下内容:

CONFIG += qtopiaapp

Page 45: Mini6410 Qt4和Qtopia编程开发指南

第 - 45 - 页

CONFIG -= buildQuicklaunch

HEADERS = main_form.h

SOURCES = main_form.cpp main.cpp

INTERFACES = main_form_base.ui

TARGET = mycalc

上面的项目文件中,CONFIG+=qtopiaapp 表示要编译的是一个 Qtopia 程序,HEADERS 和

SOURCES 列出了 mycalc 的源代码和头文件清单,而 TARGET 则指定最后生成的可执行文件名为

mycalc, CONFIG-=buildQuicklaunch 的意思是需要编译成一个独立的可执行程序,而不是应用程序

插件。

4.1.4 在 PC 上编译并运行示例

请参考 5.1.1 章节在项目目录创建一个 PC 版本的编译脚本 buildhost.sh,然后执行该脚本编译

mycalc :

# ./buildhost.sh

编译完成后,在 mycalc 下生成了 mycalc 可执行文件,接下来就让我们把它在模拟器上运行起来

(在这之前先确认你已经按本文档中的方法编译了 Qtopia2.2.0 的 PC 版本):

# cd /opt/qtopia-free-2.2.0/

# ./run&

等 Qtopia 运行起来后,并进入系统后,输入如下命令运行 mycalc:

# cd /opt/mini6410/qtopia2_apps/mycalc

# export QTDIR=/opt/qtopia-free-2.2.0/qtopia/image/opt/Qtopia/

# export QPEDIR=/opt/qtopia-free-2.2.0/qtopia/image/opt/Qtopia/

# export HOME=$QPEDIR/root/

# export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBARAY_PATH

# ./mycalc

程序在 PC 上的运行结果如下所示:

Page 46: Mini6410 Qt4和Qtopia编程开发指南

第 - 46 - 页

4.1.5 交叉编译示例程序并在 mini6410 上运行

请参考 5.1.2 章节在项目目录创建一个 ARM 版本的编译脚本 buildarm.sh,然后执行该脚本编

译 mycalc :

# ./buildarm.sh

编译完成后,在mycalc下生成了mycalc可执行文件,将它拷贝到SD卡,然后将SD插到mini6410

开发板上,在串口终端上输入以下命令将可执行文件拷贝到开发板上的 /opt/Qtopia/bin/ 目录下:

@# cp /sdcard/mycalc /opt/Qtopia/bin/

@# chmod +x /opt/Qtopia/bin/mycalc

由于我们还没有为 mycalc 添加程序图标,因此还不能通过触摸屏来运行我们的程序,我会在下

一个章节为 mycalc 添加程序图标,本章节先通过串口终端的命令行来运行,在串口终端上输入以下

命令:

@# cp /bin/run_my_qtopia /bin/run_mycalc

@# vi /bin/run_mycalc

在 vi 编辑器中,将最后一行内容:

Page 47: Mini6410 Qt4和Qtopia编程开发指南

第 - 47 - 页

exec $QPEDIR/bin/qpe

更改成:

exec $QPEDIR/bin/mycalc

再输入以下命令运行 mycalc:

@# chmod +x /bin/run_mycalc

@# run_mycalc&

在 mini6410 上的运行效果如下图所示:

4.1.6 在 Qtopia 上添加 mycalc 程序图标

要在 Qtopia 上增加图标,需要编写一个 desktop 文件,还需要设计一个图标作为程序的图标,

图标的格式需要是 png 格式的图像文件,由于设计图标远不是我的强项, 这里我就偷一下懒,在

Page 48: Mini6410 Qt4和Qtopia编程开发指南

第 - 48 - 页

Fedore9 系统中找一个现成的图标来作来 mycalc 的图标,我使用

/usr/share/icons/hicolor/48x48/apps/ 目录下的 gnome-sudoku.png 文件作为 mycalc 的图标,把它

拷贝到我们的项目目录并改名为 mycalc.png, 执行以下命令将该图标复制到mycalc的项目文件夹里

来:

# cd /usr/share/icons/hicolor/48x48/apps/

# cp gnome-sudoku.png /opt/mini6410/qtopia2_apps/mycalc/mycalc.png

接着我们编写一个 desktop 文件:

# cd /opt/mini6410/qtopia2_apps/mycalc/

# vi mycalc.desktop

在 vi 中输入以下内容并保存:

[Translation]

File=QtopiaSettings

Context=mycalc

Comment[Desktop Entry/Name]=Use soft hyphen (char U00AD) to indicate

hyphenation

[Desktop Entry]

Exec=mycalc

Icon=mycalc

Type=Application

Name[]=My Calculator

CanFastload=0

最后把 mycalc.png 和 mycalc.desktop 这两个文件放入 SD 卡,然后将 SD 卡插到 mini6410

开发板上,在串口终端上执下以下命令,把这两个文件拷贝到 Qtopia 目录的相应位置:

@# cp /sdcard/mycalc.desktop /opt/Qtopia/apps/Applications/

@# cp /sdcard/mycalc.png /opt/Qtopia/pics/

完成后重启开发板,应该可以看到应用程序图标了,就是下图中红色方框框住的图标:

Page 49: Mini6410 Qt4和Qtopia编程开发指南

第 - 49 - 页

以后就可以通过点击图标启动程序了,至此,mycalc 程序就算开发完成了。

4.2 使用 Qt Creator 工具开发第一个 Qt4 程序到 mini6410 上

4.2.1 在 Fedora9 环境下安装 Qt Creator

在网页浏览器上输入 http://qt.nokia.com/downloads, 选 Go LGPL, 然后选择 Qt SDK for Linux/X11

32-bit** (422 MB)下载最新版本 for linux 的 Qt SDK (Qt Creator),假设下载到的文件名为

qt-sdk-linux-x86-opensource-2010.05.1.bin,并且存放在/opt 目录下,则用如下命令进行安装:

# cd /opt

Page 50: Mini6410 Qt4和Qtopia编程开发指南

第 - 50 - 页

# chmod u+x qt-sdk-linux-x86-opensource-2010.05.1.bin

# ./qt-sdk-linux-x86-opensource-2010.05.1.bin

按照安装向导进行安装即可。

安装完成后,在 Fedora9 中(默认的 gnome 环境下),点击左上角的“应用程序”,选择“编程”,再

选择“Qt Creator”启动 Qt Creator。

也可以直接在终端上输入以下命令启动(前提是你的 Qt Creator 安装路径是 /opt/qtsdk-2010.05):

# /opt/qtsdk-2010.05/bin/qtcreator&

Qt Creator 的界面如下所示:

4.2.2 用 Qt Creator 创建 Qt4 程序

本章节将创建一个 Qt4 的程序示例,我将沿用之前我们编写过的加法计算器的例子。

Page 51: Mini6410 Qt4和Qtopia编程开发指南

第 - 51 - 页

4.2.2.1 步骤一:新建 Qt Gui Project

点击“File”菜单,再选择“New File or Project”,在弹出的 New 对话框中,在左边的分类中选择 Qt C++

Project, 在右边的项目类型中选择 Qt Gui Application,最后点击左下解的 Choose…按钮。

在弹出的 Instroduction and project location 对话框中,在 Name 输入框中输入项目名称为“HelloQt4“,

在 Create in 输入框中输入项目所有目录为 “/opt/mini6410”,如所图所示:

在上面的对话框中,然后点击 Next 按钮,将弹出选择 Qt Version 的对话框,什么也不改,直接点 Next,

将弹出 Class Information 对话框中,选择 Base class 为 QWidget,如下图所示:

在接下来的对话框中,一直接Next完成项目向导,完成后进入Qt Creator的主界面,将自动打开 designer

Page 52: Mini6410 Qt4和Qtopia编程开发指南

第 - 52 - 页

视图,在该视图下,可以用可视化的方式设计图形界面,如所图所示:

4.2.2.2 步骤二:设计程序界面

因为我们最终要将程序运行在 mini6410 开发板上,所以我们先将窗口的大小改成 240x240,以使其可

以在 3.5 寸的 LCD 上也能显示,修改窗口大小的方法是,在右下方的属性窗口中,将 geometry 属性的 Width

和 Height 字段都改成 240,如下图所示:

Page 53: Mini6410 Qt4和Qtopia编程开发指南

第 - 53 - 页

在属性窗口中顺便把窗口的标题(Windows Title)改成 My Calc:

接下来在窗口上放置以下控件:

1) 二个 Push Button(按钮): 一个显示为等于号,用于点击时计算结果,一个用于退出程序。

Page 54: Mini6410 Qt4和Qtopia编程开发指南

第 - 54 - 页

2) 三个 Line Edit(单行文本框): 两个用于输入要执行加法运算的数字,另一个用于显示计算结果。

3) 一个 Label(文本标签):用于显示加号。

请按照下图所示进行控件的布局,如你在下图所见的,我将 Label 控件和按钮上面的文字都更改了,

更改方法是双击控件,然后输入文字即可:

然后,我们修改三个 Line Edit 文本控件的 objectName 属性,将它们分别命名为 m_x, m_y, m_result, 如

下图所示:

Page 55: Mini6410 Qt4和Qtopia编程开发指南

第 - 55 - 页

4.2.2.3 步骤三:编写代码

在 Design 视图中,右击“=”按钮,选择“Go to slot”,在弹出的 Go to slot 对话框中,选择 clicked()

然后点击“OK”按钮即可为“=”按钮添加 clicked 信号处理函数 on_pushButton_clicked(),界面将定位到

“Edit”代码编辑视图,光标将在 on_pushButton_clicked()函数内闪烁,我们在函数内部输入“=”按钮的处

理代码:

ui->m_result->setText( "" );

if (ui->m_x->text().isEmpty() || ui->m_y->text().isEmpty()) {

return ;

}

Page 56: Mini6410 Qt4和Qtopia编程开发指南

第 - 56 - 页

bool ok = false;

int x = ui->m_x->text().toInt(&ok);

if (!ok) {

ui->m_x->setText("");

return ;

}

ok = false;

int y = ui->m_y->text().toInt(&ok);

if (!ok) {

ui->m_y->setText("");

return ;

}

ui->m_result->setText( QString::number( x + y ) );

代码的编写如下图所示:

Page 57: Mini6410 Qt4和Qtopia编程开发指南

第 - 57 - 页

编写完“=”按钮的代码之前,在上图左下方的 Open Documents 子窗口中,选择 widget.ui,界面将切

换回界面设计视图(如果未切换,在左边再点击一下 Design 按钮),切换到界面设计视图后,右击“Close”

按钮,选择“Go to slot”,在弹出的 Go to slot 对话框中,选择 clicked()然后点击“OK”按钮,界面将定位

到“Edit”代码编辑视图,光标将在 on_pushButton_2_clicked()函数内闪烁,我们在函数内部输入如下代码:

close();

代码的编写如下图所示:

Page 58: Mini6410 Qt4和Qtopia编程开发指南

第 - 58 - 页

至此,代码编写完毕。

4.2.2.4 步骤四:在 PC 上编译并运行示例程序

在界面左边点击 按钮编译并在 PC 上运行程序,运行结果如下图所示:

Page 59: Mini6410 Qt4和Qtopia编程开发指南

第 - 59 - 页

接下来的章节中我们将这个程序交叉编译并在 mini6410 上运行。

4.2.3 设置 Qt Creator 使其支持交叉编译

首先确否你已经参考用户手册在 Fedora9 上安装了 QtEmbedded-4.7.0-arm,安装在 PC 上的目录为

/usr/local/Trolltech/QtEmbedded-4.7.0-arm/,如果还没有安装,参照 mini6410 用户手册的 4.12.2 章节编译

QtE-4.7.0, 然后将打包得到的 target-qte-4.7.0.tgz 在 PC 上的根目录解压即可,步骤如下所示:

# tar xvzf target-qte-4.7.0.tgz –C /

下面将设置 Qt Creator 使其使用 QtEmbedded-4.7.0-arm 编译程序,请按照如下步骤设置:

1) 点击 Tools->Options->Qt4->Qt Versions.

2) 点击右侧的 按钮,然后在下方的编辑框中输入 Version name 为 QtEmbedded4.7.0, qmake

location 为/usr/local/Trolltech/QtEmbedded-4.7.0-arm/bin/qmake,如下图所示:

(注:如果你已经参照本文档 2.3 章节编译过 QtE4.7,你也可以将它放在 PC 上的 opt/Qt4.7/目录下,

然后将上面的 /usr/local/Trolltect/QtEmbedded-4.7.0-arm/ 替换成 opt/Qt4.7/)

3) 最后点击 OK。

Page 60: Mini6410 Qt4和Qtopia编程开发指南

第 - 60 - 页

4.2.4 交叉编译 Qt4 程序

在 Qt Creator 主界面的左侧,点击 按钮,在 Build Settings 中,在 Edit build configuration 下拉

框中选择“Qt in PATH Release”,然后在Qt version 下拉框中选择QtEmbedded4.7.0,最后,修改 Build directory

为/opt/mini6410/HelloQt4-build-arm, 所有的修改结果如下图所示:

修改完成后,点击 Qt Creator 主界面左侧的 按钮,确认 build 的设置为 Qt in PATH Release,然

后点击 开始进行交叉编译,在编译过程中,点击左侧的 Build 进度条可以查看编译过程和结果,

如下图所示:

Page 61: Mini6410 Qt4和Qtopia编程开发指南

第 - 61 - 页

编译成功后,编译产出的可执行文件位于 /opt/mini6410/HelloQt4-build-arm 目录下,文件名为 HelloQt4。

4.2.5 将 Qt4 程序部置到 mini6410 上运行

将/opt/mini6410/HelloQt4-build-arm 目录下的 HelloQt4 可执行文件拷贝到 SD 卡,然后将 SD 卡插到

mini6410 开发板上,执行以下命令将程序拷贝到 mini6410 上:

@# cp /sdcard/HelloQt4 /bin

@# chmod +x HelloQt4

然后参考章节 3.3.4 编写的一个 setqt4env 脚本(如果这个脚本未存在的话),编写完成后,执行以下

命令运行我们的 Qt4 程序:

@# . setqt4env

@# HelloQt4 -qws

上面的命令中,先调用 setqt4env 设置一下环境变量,再调用示例程序,注意,setqt4env 命令前面的

“.”和 setqt4env 之前有一个空格。

Page 62: Mini6410 Qt4和Qtopia编程开发指南

第 - 62 - 页

示例程序的运行结果如下:

可惜由于 Qt4.7 下没有虚拟键盘,我们没有办法用这个程序进行加法计算,不过此示例的目的是演示

如果用 Qt Creator 编译一个完整的 Qt4 程序,并将其交叉编译运行,目的已经达到啦,在下面的章节中,

我会将此程序移植到 Qt-Extended4.4.3 上。

4.3 开发第一个 Qt-Extended 4.4.3 程序

由于 Qt-Extended4.4.3 实际上是基于 Qt4,所以为了节约篇幅,本章节的示例我不打算从零开始构建了,

我们选择将上一节我们编写的 HelloQt4 示例移植到 Qt-Extended4.4.3 上运行。

在开始之前,假设你已经参考章节 3.4 编译了 Qt-Extended4.4.3,同时参考上一个章节用 Qt Creator

构造了 HelloQt4 程序。

Page 63: Mini6410 Qt4和Qtopia编程开发指南

第 - 63 - 页

4.3.1 步骤一:复制 HelloQt4 程序到 Qt-Extended 4.4.3 下

在章节 3.4 中,我们介绍了如何编译和安装 Qt-Extended4.4.3,Qt-Extended4.4.3 的源代码我们放在

/opt/mini6410/qt-extended4.4.3/qt-extended-4.4.3/目录下,现在我们执下如下命令,将上一个章节创建的 Qt

示例程序 HelloQt4 的源代码复制到 Qt-Extended4.4.3 中,HelloQt4 需要存放在 Qt-Extended4.4.3 目录的

src/applications 子目录下:

# cd /opt/mini6410/qt-extended4.4.3/qt-extended-4.4.3/

# cp /opt/mini6410/HelloQt4 src/applications -a

4.3.2 步骤二:为 HelloQt4 程序添加图标

为了能够显示 HelloQt4 的程序图标,并通过点击图标启动程序,需要在 HelloQt4 中创建一个 desktop

文件,还需要一个图标作为 HelloQt4 的图标,图标的格式需要是 png 格式的图像文件,像素建议用 48x48

像素的图标),请读者自行用 Photoshop 或者 GIMP 等图形工具设计图标,这里不对图标的制作过程

进行描述。

不想设计图标的读者可以在 Fedora9 系统下的以下目录:/usr/share/icons/hicolor/48x48/apps/

寻找一个相似的图标来使用,或者上网访问 http://www.iconpng.com 网址搜索并下载一个图标,注

意要下载 png 格式的。

图标制作或者找到现成的后,将其命名为 HelloQt4.png,并复制到 HelloQt4 工程目录的 pics 目

录下,pics 目录原来是不存在的,需要我们自已创建:

# cd /opt/mini6410/qt-extended4.4.3/qt-extended-4.4.3/src/applications/HelloQt4

# mkdir pics

# cp /opt/HelloQt4.png pics

(注:上面的命令假设了你将 HelloQt4.png 图标放在/opt 下)

接着我们编写一个 desktop 文件:

# cd /opt/mini6410/qt-extended4.4.3/qt-extended-4.4.3/src/applications/HelloQt4

# vi HelloQt4.desktop

在 vi 中输入以下内容并保存:

[Translation]

File=QtopiaApplications

Context=HelloQt4

Page 64: Mini6410 Qt4和Qtopia编程开发指南

第 - 64 - 页

[Desktop Entry]

Comment[]=HelloQt4

Exec=HelloQt4

Icon= HelloQt4/HelloQt4

Type=Application

Name[]=HelloQt4

Categories=MainApplications

4.3.3 步骤三:将 Qt4 程序转换成 Qt-Extended 4.4.3 程序

由于 HelloQt4 示例程序只是一个 Qt4 程序,我们需要把它转换成 Qt-Extended4.4.3 程序才能和

Qt-Extended 配合起来,转换方法需要修改 HelloQt4 下的 main.cpp 源代码文件和工程文件,如下所示:

4.3.3.1 main.cpp 文件的修改

# cd /opt/mini6410/qt-extended4.4.3/qt-extended-4.4.3/src/applications/HelloQt4

# vi main.cpp

将 main.cpp 文件中的:

#include <QtGui/Qapplication>

修改为

#include <QtopiaApplication>

再将 main 函数中的:

QtopiaApplication

修改为

QtopiaApplication

Page 65: Mini6410 Qt4和Qtopia编程开发指南

第 - 65 - 页

4.3.3.2 重新生成工程文件

输入以下命令,我们将删除原有的 HelloQt4.pro 文件,并用 Qt-Extended-4.4.3 下的 qbuild 工具重新生

成工程文件,在 Qt-Extended-4.4.3 下,所有程序的工程文件都统一为 qbuild.pro:

# cd /opt/mini6410/qt-extended4.4.3/qt-extended-4.4.3/src/applications/HelloQt4

# rm HelloQt4.pro –f

# /opt/mini6410/qt-extended4.4.3/buildx86/bin/qbuild -project

执行上述命令后,将在 HelloQt4 目录下生成 qbuild.pro 文件。

4.3.4 步骤四:在 Qt-Extended 4.4.3 文件中添加对 HelloQt4 应用程序

的支持

在 Qt-Extended4.4.3 中增加了一个应用程序,需要在 projects.pri 文件中添加对程序的支持,修改方法

是:

# cd /opt/mini6410/qt-extended4.4.3/qt-extended-4.4.3/src/

# vi projects.pri

在 projects.pri 文件最后一行增加如下内容:

PROJECTS *= applications/HelloQt4

经过这样的修改之后,每次编译 Qt-Extended-4.4.3 时,会自动编译 HelloQt4 程序。

4.3.5 步骤五:在 Qt-Extended 4.4.3 下编译 PC 版本的 HelloQt4

进入 buildx86 目录下的 HelloQt4 工程目录,然后在 HelloQt4 目录下执行 qbuild image 即可编译并安装

HelloQt4:

# cd /opt/mini6410/qt-extended4.4.3/buildx86/src/applications/HelloQt4

# /opt/mini6410/qt-extended4.4.3/buildx86/bin/qbuild image

编译完成后,执行以下命令运行 Qt-Extended4.4.3:

# cd /opt/mini6410/qt-extended4.4.3/buildx86

# bin/runqtopia

Page 66: Mini6410 Qt4和Qtopia编程开发指南

第 - 66 - 页

在里面找到 HelloQt4 的图标点击,将运行 HelloQt4 程序,运行效果如下图所示:

4.3.6 步骤六:在 Qt-Extended 4.4.3 下编译 arm 版本的 HelloQt4

进入 buildarm 目录,创建 HelloQt4 目录:

# cd /opt/mini6410/qt-extended4.4.3/buildarm

# mkdir –p src/applications/HelloQt4

然后在 HelloQt4 目录下执行 qbuild image 即可交叉编译并安装 HelloQt4:

# cd /opt/mini6410/qt-extended4.4.3/buildarm/src/applications/HelloQt4

# /opt/mini6410/qt-extended4.4.3/buildarm/bin/qbuild image

Page 67: Mini6410 Qt4和Qtopia编程开发指南

第 - 67 - 页

4.3.7 步骤七:在 mini6410 的 Qt-Extended 4.4.3 下部署并运行

HelloQt4

编译完成后,参考章节“3.4.3.2 在开发板上部置 Qt-Extended-4.4.3”和章节“3.4.3.3 在开发板上运行

Qt-Extended-4.4.3”这两章中的内容,将 Qt-Extended 4.4.3 重新打包并部置到 mini6410 上运行,运行后,在

里面找到 HelloQt4 的图标点击,就可以启动 HelloQt4 程序了,运行效果如下图所示:

4.4 通过命令行方式创建一个 Qt4 程序

本章节示例的目的是演示如何在命令行创建一个 Qt4 程序并且交叉编译到 mini6410 上运行,因此程序

尽量简单,我们就以 Hello,min6410!作例子吧。

在终端上输入以下命令,创建 HelloMini6410 目录,并用 vi 在该目录下创建源代码文件 main.cpp:

# mkdir /opt/mini6410/HelloMini6410

Page 68: Mini6410 Qt4和Qtopia编程开发指南

第 - 68 - 页

# cd /opt/mini6410/HelloMini6410

# vi main.cpp

在 main.cpp 中输入如下内容:

#include <QApplication>

#include <QLabel>

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

QLabel label("Hello mini6410!");

label.show();

return a.exec();

}

上面的程序非常简单,程序启动将显示一个 QLabel 并显示文字“Hello mini6410!”,源代码写好了,

接着需要为“Hello,mini6410!”程序生成工程文件,使用 qmake 的-project 选项生成工程文件:

# /opt/Qt4.7/bin/qmake -project

(注:上述命令已经假设了你参照本手册的章节 3.3 编译并部置了 QtE4.7 到/opt 目录下)

执行 qmake –project 后,将生成一个名为 HelloMini6410.pro 的工程文件,你可以通过修改它来修改项

目属性等,这里我们不进行任何修改,继续输入 qmake 生成 Makefile 文件:

# /opt/Qt4.7/bin/qmake

最后输入 make 进行交叉编译:

# make

编译完成后,HelloMini6410 目录下会生成可执行文件 HelloMini6410,将它用 SD 卡拷贝到 mini6410

开发板上运行即可,运行方法可参考 4.2.5 章节。

Page 69: Mini6410 Qt4和Qtopia编程开发指南

第 - 69 - 页

4.5 串口助手程序的开发

4.5.1 本示例的设计目的

本实例的目的是演示如何在 Qtopia中编写一个串口通讯程序,该串口通讯程序可以实现开发板与其

它设备进行串口连接和双向通讯,功能和实现方法与友善之臂提供的 Linux平台下串口助手基本相同,为

了凸显原理,本实例对串口助手进行了简化。

如果你需要运行本实例的程序源代码,请先确认你的开发板用串口助手能正常工作,再编译并运行自

已的示例,在这之前,你首先需要有一块串口扩展板以及交叉串口线,或者 USB转串口线也可以,请参考

mini6410用户手册关于“串口助手”的相关章节。

运行并调试示例程序时,需要使用交叉串口线将开发板与 PC进行连接,在 mini6410 上运行串口实例

程序,然后在 PC上运行 PuTTY(或者超级终端),两端配置好串口参数,PC与 mini6410 开发板就可以进

行双向通讯了,两端的通讯界面如下图所示:

在 /opt/qtopia2_apps 目录下创建 serialport 作为本示例的项目目录,在终端上输入如下命令:

# mkdir –p /opt/mini6410/qtopia2_apps/serialport

4.5.1 串口通讯的 Qt 实现步骤及原理

在开始写代码之前,让我们先探讨一下串口通讯的基本原理。

Page 70: Mini6410 Qt4和Qtopia编程开发指南

第 - 70 - 页

4.5.1.1 首先要打开串口设备,并设置属性

要进行串口通讯,首先要打开串口设备,使用 Linux 下的 open函数即可打开,打开串口设备后,还

需要用 tcsetattr来设置波特率等串口属性,代码如下所示:

int openSerialPort()

{

int fd = -1;

const char *devName = "/dev/ttySAC2";

fd = ::open(devName, O_RDWR|O_NONBLOCK);

if (fd < 0) {

return -1;

}

termios serialAttr;

memset(&serialAttr, 0, sizeof serialAttr);

serialAttr.c_iflag = IGNPAR;

serialAttr.c_cflag = B115200 | HUPCL | CS8 | CREAD | CLOCAL;

serialAttr.c_cc[VMIN] = 1;

if (tcsetattr(fd, TCSANOW, &serialAttr) != 0) {

return -1;

}

return fd;

}

上面的代码并没有涉及到 Qt部分,所以你可以移植到其它 C/C++程序中,注意代码中的粗体部分,上

述代码中打开的串口设备文件名为 /dev/ttySAC2,并设置波特率为 115200, 然后将 Data bits 改为 8,

你需要根据你的实际情况修改这些设置,一般情况下只需要修改串口设备的文件名即可,如果你修改了波

特率等其它参数,记得另一端的设备(PC)也需要进行同步的修改,串口位置及对应的串口设备文件名如

下所示:

Page 71: Mini6410 Qt4和Qtopia编程开发指南

第 - 71 - 页

由于 /dev/ttySAC0 已经用作 console,所以你只能使用 /dev/ttySAC1 ~ /dev/ttySAC3 这三个串口,

也可以使用 USB Host,另外要记得用交叉串口线。

4.5.1.2 如何实现串口设备的读写

要对串口设备进行读写,使用 Linux标准 i/o函数 read和 write即可。当我们使用调用 write(fd,

“abcd”,4)往串口设备写 abcd 时,PC端的终端上会显示 abcd,同理,当在 PC端上输入字符时,使用

read(fd, buff, sizeof buff) 来读取 PC端发送过来的字符。

现在问题是,我们如何知道 PC端有数据发送过来呢?

由于我们的程序有图形界面,所以不能用循环来忙等数据到来,因为这样会导致界面被阻塞(造成界

面假死),可以用 timer驱动的方法来轮询设备是否有数据到来,但用 timer缺点是不够及时,那么能不

能开一个新的线程或进程来监听串口数据呢?我们不主张这样做,因为,第一,多个线程/进程之间的通

讯、同步会给程序带有额外的复杂性,而复杂的程序容易写错;第二,多进程/线程消耗的系统资源较多;

第三,包括 Qt/Qtopia在内的应用软件开发框架,都可以用较为简单的方法使 UI程序和设备数据处理程

序一起工作。

Qt被设计成事件驱动的,其实事件驱动在 UI系统中使用得非常普遍,在 Microsoft Windows中,被

称为“消息驱动”,核心概念是“Don’t call me,I’ll Call you”。这个概念非常基础,本文不描述,

不了解的读者可找其它资料看看。设备的事件驱动式设计,相应就是“不要等数据可访问,可访问时系统

会找你”,而在 Qt中,可以使用 QSocketNotifier类来达到设备事件驱动式设计目的。

下面将说明如何使用 QSocketNotifier 来监听串口数据:

在使用 open方法打开串口并设置好属性后,可以使用 Qt的类 QSocketNotifier 来监听串口是否有数

据可读,它是事件驱动的, 配合 Qt的 signal/slot 机制,当有数据可读时,QSocketNotifier就会发射

ativated 信号,你只需要创建一个 slot 连接到该信号即可,代码如下所示:

m_fd = openSerialPort();

Page 72: Mini6410 Qt4和Qtopia编程开发指南

第 - 72 - 页

if (m_fd < 0) {

QMessageBox::warning(this, tr("Error"), tr("Fail to open serial port!"));

return ;

}

m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);

connect (m_notifier, SIGNAL(activated(int)), this, SLOT(remoteDataIncoming()));

在上述代码中,我们首先使用上面封装的 openSerialPort 函数打开串口并配置串口属性,接着我们

用 m_fd 和 QSocketNotifier::Read 作为参数构造了一个 QSocketNotifier的实例,

QSocketNotifier::Read参数表示我们需要关心串口的可读状态,最后将 QSocketNotifier实例的

activated 信号连接到 remoteDataIncoming slot,当有数据可读时,remoteDataIncoming slot会被调

用。

下面是 remoteDataIncoming slot 的代码,它的代码比较简单,只是调用 read 函数读取串口数据,

然后将数据显示到界面上:

void TMainForm::remoteDataIncoming()

{

char c;

if (read(m_fd, &c, sizeof c) != 1) {

QMessageBox::warning(this, tr("Error"), tr("Receive error!"));

return;

}

m_receiveEdit->insert(QString(QChar(c)));

}

细心的读者可以注意到,上面的函数在读串口数据时,每次只读取 1个字节, 如果设备拥有超过一个

字节可读会不会有问题呢?答案是否定的,当有超过一个字节的数据可读时,在一次读取并退出 slot后,

如果还有数据未读取,ativated还会再次被触发,所以程序逻辑没有问题。本例子每次只读取 1字节,是

为了凸显原理,如果你的应用对系统性能和吞吐量有较高要求,则可以批量读。

至此,串口编程的相关要点就说明到此,下面开始编写完整的源代码。

4.5.2 使用 designer 工具设计图形界面

Qt/Qtopia 都带有 designer 工具,可以设计所见即所得的图形界面,我们现在就使用 designer 工

具来设计 serialport 程序的主界面,主界面将保存成名为 main_form_base.ui 的 ui 文件(这种类型

Page 73: Mini6410 Qt4和Qtopia编程开发指南

第 - 73 - 页

的文件在编译时会被 uic 编译器解析,并生成 C++代码),输入如下命令启动 designer 工具,并以 ui

文件名作为参数:

# cd /opt/mini6410/qtopia2_apps/serialport

# /opt/mini6410/qtopia-free-2.2.0/qt2/bin/designer main_form_base.ui

在弹出的 New Form 界面中,选择“Widget”然后点击”OK“,我们将创建一个基于 QWidget 的窗

体而不是 QDialog 或其它:

这时,将会显示窗口的编辑画面,我们需要修改窗口的大小,使得 3.5 寸的屏幕也能完整显示我

们的程序,并且需要修改窗口标题, 请参考下图的提示修改窗口的属性值:

Page 74: Mini6410 Qt4和Qtopia编程开发指南

第 - 74 - 页

4.5.2.1 在窗体上放置控件

修改完窗口的属性值后,接下来我们就要在窗口上放置控件了,往窗口上放置控件的方法是:在

工具栏上点击要放置的控件,再在窗口空白处点击一下即可。

根据我们最初的设计思路,我们需要在窗口上放置以下控件:

1) 一个 Button(按钮): 用于将文本写入串口发送至对端。

2) 二个 Multi Line Edit (多行文本框): 一个用于显示从对端接收到数据,另一个用于用户输入要

发送的数据。

请参考下图放置上面列出的控件,控件的工具栏图标在下图中我已经以红色方框标记出来了:

Page 75: Mini6410 Qt4和Qtopia编程开发指南

第 - 75 - 页

放置完控件之后,我们将按钮上的文字改为“Send”,修改方法是双击按钮,然后在弹出的编辑框

上输入“Send”即可。

修改完控件上文字之后,按照上图的位置摆放控件,在摆放之前,需要适当地调整控件的大小,

调整控件大小的方法是,先单击要调整的控件,然后在控件的边框上的小黑框上单击拖动即可。

4.5.2.2 修改控件属性

我们需要修改文本框的实例名称,这样在代码里面可以方便引用它们,修改方法是点击左边的文

本框控件,在右边的属性窗口进行修改,请按下图的指示修改二个文本编辑控件的属性:

Page 76: Mini6410 Qt4和Qtopia编程开发指南

第 - 76 - 页

按下图的提示修改按钮的属性:

Page 77: Mini6410 Qt4和Qtopia编程开发指南

第 - 77 - 页

至此,界面设计完毕。

4.5.3 编写代码

现在开始为 serialport 编写代码,我们需要创建三个源代码文件,一个是头文件 main_form.h,

一个是源代码文件 main_form.cpp,一个是 main.cpp,分别在以下章节中创建这些文件。

4.5.3.1 编写程序入口 main.cpp

首先用 vi 编辑器创建并打开 main.cpp 文件:

# vi main.cpp

在 vi 编辑器中输入如下源代码内容:

Page 78: Mini6410 Qt4和Qtopia编程开发指南

第 - 78 - 页

#include "main_form.h"

#include <qtopia/qpeapplication.h>

QTOPIA_ADD_APPLICATION("serialport",TMainForm)

QTOPIA_MAIN

main.cpp 只有 4 行源代码,它的实现很简单,宏展开后会是一个 main 函数,然后创建

QPEApplication 对象 和 TMainForm 主窗口对象,最后显示主窗口并执行 QApplication::exec()进入

事件循环。

main.cpp 所用到的头文件 main_form.h 和 TMainForm 类到目前为止还不存在,我们接下来就要

新建它们。

4.5.3.2 编写主窗口头文件 main_form.h

接下来用 vi 编辑器创建并打开 main_form.h 文件:

# vi main_form.h

在 vi 编辑器中输入如下源代码内容:

#if !defined (__MAIN_FORM_H__)

# define __MAIN_FORM_H__

#include "main_form_base.h"

#include <qsocketnotifier.h>

class TMainForm: public TMainFormBase {

Q_OBJECT

public:

TMainForm(QWidget * parent = 0, const char * name = 0, WFlags f = WType_TopLevel);

virtual ~TMainForm();

private:

int openSerialPort();

private slots:

void sendButtonClicked();

void remoteDataIncoming();

private:

int m_fd;

Page 79: Mini6410 Qt4和Qtopia编程开发指南

第 - 79 - 页

QSocketNotifier *m_notifier;

};

#endif

main_form.h 文件中包含了 main_form_base.h 头文件,这个 main_form_base.h 头文件不需要

用户编写,编译时由 uic 编译器根据 main_form_base.ui 文件自动生成的,main_form_base.h 文件

的代码实现了界面的基类 TMainFormBase, 因此,要使用我们自已用 designer 设计的程序界面,我

们只需将主窗口 TMainForm 从 TMainFormBase 类继承即可。

除此之外,我们声明了两个类成员变量,m_fd 用于保存串口设备的句柄,m_notifier 指向

QSocketNotifier 对象,用于监听串口是否有数据到来。

另外还声明了两个 slot 函数, slot 函数 remoteDataIncoming()连接到 m_notifier 实例的 actived

信号,用于处理串口远端到来的数据,而 slot 函数 sendButtonClicked()则用于处理 Send 按钮的点击

事件。

4.5.3.3 编写主窗口源文件 main_form.cpp

接下来用 vi 编辑器创建并打开 main_form.cpp 文件:

# vi main_form.cpp

在 vi 编辑器中输入如下源代码内容:

#include "main_form.h"

#include <qmultilineedit.h>

#include <qprogressbar.h>

#include <qtimer.h>

#include <qapplication.h>

#include <qmessagebox.h>

#include <qstringlist.h>

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/ioctl.h>

Page 80: Mini6410 Qt4和Qtopia编程开发指南

第 - 80 - 页

#include <fcntl.h>

#include <linux/fs.h>

#include <errno.h>

#include <string.h>

#include <termio.h>

TMainForm::TMainForm(QWidget * parent, const char * name, WFlags

f):TMainFormBase(parent, name, f), m_notifier(0)

{

m_fd = openSerialPort();

if (m_fd < 0) {

QMessageBox::warning(this, tr("Error"), tr("Fail to open serial port!"));

return ;

}

m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);

connect (m_notifier, SIGNAL(activated(int)), this, SLOT(remoteDataIncoming()));

}

TMainForm::~TMainForm()

{

if (m_notifier) {

delete m_notifier;

m_notifier = 0;

}

if (m_fd >= 0) {

::close(m_fd);

m_fd = -1;

}

}

void TMainForm::sendButtonClicked()

{

QString text( m_sendEdit->text() );

if (text.isEmpty()) {

return ;

Page 81: Mini6410 Qt4和Qtopia编程开发指南

第 - 81 - 页

}

::write(m_fd, text.latin1(), text.length());

m_sendEdit->setText("");

}

int TMainForm::openSerialPort()

{

int fd = -1;

const char *devName = "/dev/ttySAC2";

fd = ::open(devName, O_RDWR|O_NONBLOCK);

if (fd < 0) {

return -1;

}

termios serialAttr;

memset(&serialAttr, 0, sizeof serialAttr);

serialAttr.c_iflag = IGNPAR;

serialAttr.c_cflag = B115200 | HUPCL | CS8 | CREAD | CLOCAL;

serialAttr.c_cc[VMIN] = 1;

if (tcsetattr(fd, TCSANOW, &serialAttr) != 0) {

return -1;

}

return fd;

}

void TMainForm::remoteDataIncoming()

{

char c;

if (read(m_fd, &c, sizeof c) != 1) {

QMessageBox::warning(this, tr("Error"), tr("Receive error!"));

return;

}

m_receiveEdit->insert(QString(QChar(c)));

}

上述源代码的主要功能在 4.5.1 串口通讯的 Qt 实现步骤及原理 这一章节中已经详细描述,因此

这里不再重复了。

Page 82: Mini6410 Qt4和Qtopia编程开发指南

第 - 82 - 页

4.5.3.4 编写项目文件 serialport.pro

源代码写完了,在编译之前,还得再写一个 serialport.pro 项目文件。

接下来用 vi 编辑器创建并打开 serialport.pro 文件:

# vi serialport.pro

在 vi 编辑器中输入如下内容:

CONFIG += qtopiaapp

CONFIG -= buildQuicklaunch

HEADERS = main_form.h

SOURCES = main_form.cpp main.cpp

INTERFACES = main_form_base.ui

TARGET = serialport

上面的项目文件中,CONFIG+=qtopiaapp 表示要编译的是一个 Qtopia 程序,HEADERS 和

SOURCES 列出了 serialport 的源代码和头文件清单,而 TARGET 则指定最后生成的可执行文件名为

serialport, CONFIG-=buildQuicklaunch 的意思是需要编译成一个独立的可执行程序,而不是应用程

序插件。

4.5.4 交叉编译 serialport 程序

请参考 5.1.2 章节在项目目录创建一个 ARM 版本的编译脚本 buildarm.sh,然后执行该脚本编

译 serialport :

# ./buildarm.sh

编译完成后,在 serialport 下生成了 serialport 可执行文件,把它拷贝到 SD 卡,然后将 SD 插到

mini6410 开发板上,在串口终端上输入以下命令将可执行文件拷贝到开发板上的 /opt/Qtopia/bin/ 目

录下:

@# cp /sdcard/serialport /opt/Qtopia/bin/

@# chmod +x /opt/Qtopia/bin/serialport

Page 83: Mini6410 Qt4和Qtopia编程开发指南

第 - 83 - 页

4.5.5 在 mini6410 上运行 serialport

由于 serialport 一启动就会打开串口,因此在运行之前,请先确认串口线已经成功连接。

由于我们还没有为 serialport 添加程序图标,因此还不能通过触摸屏来运行我们的程序,我会在

下一个章节为 serialport 添加程序图标,本章节先通过串口终端的命令行来运行,在串口终端上输入

以下命令:

@# cp /bin/run_my_qtopia /bin/run_serialport

@# vi /bin/run_serialport

在 vi 编辑器中,将最后一行内容:

exec $QPEDIR/bin/qpe

更改成:

exec $QPEDIR/bin/serialport

再输入以下命令运行 serialport:

@# chmod +x /bin/run_serialport

@# run_serialport&

在 mini6410 上的运行效果如下图所示:

Page 84: Mini6410 Qt4和Qtopia编程开发指南

第 - 84 - 页

4.5.6 在 Qtopia 上添加 serialport 程序图标

要在 Qtopia 上增加图标,需要编写一个 desktop 文件,还需要设计一个图标作为程序的图标,

图标的格式需要是 png 格式的图像文件,像素建议用 48x48 像素的图标),请读者自行用 Photoshop

或者 GIMP 等图形工具设计图标,这里不对图标的制作过程进行描述。

不想设计图标的读者可以在 Fedora9 系统下的以下目录:/usr/share/icons/hicolor/48x48/apps/

寻找一个相似的图标来使用,或者上网访问 http://www.iconpng.com 网址搜索并下载一个图标,注

意要下载 png 格式的。

图标制作或者找到现成的后,将其命名为 serialport.png,并复制用

/opt/mini6410/qtopia2_apps/serialport/目录下。

接着我们编写一个 desktop 文件:

# cd /opt/mini6410/qtopia2_apps/serialport/

# vi serialport.desktop

在 vi 中输入以下内容并保存:

Page 85: Mini6410 Qt4和Qtopia编程开发指南

第 - 85 - 页

[Translation]

File=QtopiaSettings

Context=serialport

Comment[Desktop Entry/Name]=Use soft hyphen (char U00AD) to indicate

hyphenation

[Desktop Entry]

Exec=serialport

Icon=serialport

Type=Application

Name[]=My Calculator

CanFastload=0

把 serialport.png 和 serialport.desktop 这两个文件放入 SD 卡,然后将 SD 卡插到 mini6410

开发板上,在串口终端上执下以下命令,把这两个文件拷贝到 Qtopia 目录的相应位置:

@# cp /sdcard/serialport.desktop /opt/Qtopia/apps/Applications/

@# cp /sdcard/serialport.png /opt/Qtopia/pics/

完成后重启开发板,应该可以看到应用程序图标了, 以后就可以通过点击图标启动程序了,至此,

serialport 程序就算开发完成了。

4.6 PWM 测试程序的开发

4.6.1 本示例的设计目的

本实例编写一个蜂鸣器的测试程序,读者可以通过该示例了解到如何在程序中控制开发板上的蜂鸣器

让其发声。

在 /opt/qtopia2_apps 目录下创建 pwm-testing作为本示例的项目目录,在终端上输入如下命令:

# mkdir –p /opt/mini6410/qtopia2_apps/pwm-testing

4.6.2 如何控制蜂鸣器发声

要控制蜂鸣器发声,首先需要打开蜂鸣器的设备文件,如下所示:

Page 86: Mini6410 Qt4和Qtopia编程开发指南

第 - 86 - 页

fd = ::open("/dev/pwm", O_RDONLY);

通过以下 ioctl,让蜂鸣器按参数 f 指定的频率发声:

::ioctl(fd, 1, f);

要让蜂鸣器停止发声,通过以下 ioctl 控制:

::ioctl(fd, 0);

4.6.3 使用 designer 工具设计图形界面

输入如下命令启动 designer 工具,并以 main_form_base.ui 为了主界面 ui 的文件名:

# cd /opt/mini6410/qtopia2_apps/pwm-testing

# /opt/mini6410/qtopia-free-2.2.0/qt2/bin/designer main_form_base.ui

在弹出的 New Form 界面中,选择“Widget”然后点击”OK“,我们将创建一个基于 QWidget 的窗

体而不是 QDialog 或其它:

这时,将会显示窗口的编辑画面,我们需要修改窗口的大小,使得 3.5 寸的屏幕也能完整显示我

们的程序,并且需要修改窗口标题, 请参考下图的提示修改窗口的属性值:

Page 87: Mini6410 Qt4和Qtopia编程开发指南

第 - 87 - 页

4.6.3.1 在窗体上放置控件

我们往窗体上放置三个按钮控件,一个用于启动蜂鸣器发声,另一个用于让蜂鸣器停止发声,另一个

用于退出程序,请参考下图对控件进行布局:

Page 88: Mini6410 Qt4和Qtopia编程开发指南

第 - 88 - 页

4.6.3.2 设置控件属性

接下来按照下图的指示,设置三个按钮的属性:

Page 89: Mini6410 Qt4和Qtopia编程开发指南

第 - 89 - 页

Page 90: Mini6410 Qt4和Qtopia编程开发指南

第 - 90 - 页

至此,界面设计完毕。

4.6.4 编写代码

现在开始为 pwm-testing编写代码,我们需要创建三个源代码文件,一个是头文件 main_form.h,

一个是源代码文件 main_form.cpp,一个是 main.cpp,分别在以下章节中创建这些文件。

4.6.4.1 编写程序入口 main.cpp

首先用 vi 编辑器创建并打开 main.cpp 文件:

# vi main.cpp

在 vi 编辑器中输入如下源代码内容:

#include "main_form.h"

#include <qtopia/qpeapplication.h>

QTOPIA_ADD_APPLICATION("pwm-testing",TMainForm)

QTOPIA_MAIN

main.cpp 只有 4 行源代码,它的实现很简单,宏展开后会是一个 main 函数,然后创建

Page 91: Mini6410 Qt4和Qtopia编程开发指南

第 - 91 - 页

QPEApplication 对象 和 TMainForm 主窗口对象,最后显示主窗口并执行 QApplication::exec()进入

事件循环。

main.cpp 所用到的头文件 main_form.h 和 TMainForm 类到目前为止还不存在,我们接下来就要

新建它们。

4.6.4.2 编写主窗口头文件 main_form.h

接下来用 vi 编辑器创建并打开 main_form.h 文件:

# vi main_form.h

在 vi 编辑器中输入如下源代码内容:

#if !defined (__MAIN_FORM_H__)

# define __MAIN_FORM_H__

#include "main_form_base.h"

class TMainForm: public TMainFormBase {

Q_OBJECT

public:

TMainForm(QWidget * parent = 0, const char * name = 0, WFlags f = WType_TopLevel);

virtual ~TMainForm();

private slots:

void buttonClicked();

private:

int m_fd;

};

#endif

main_form.h 头文件为 TMainForm类定义了一个成员变量 m_fd,用于保存/dev/pwm设备文

件的句柄,还定义了一个 buttonClicked(),界面上的三个按钮的 clicked()信号都将连接到此

slot 函数,我们会用 sender()函数来判断用户点击了那一个按钮。

Page 92: Mini6410 Qt4和Qtopia编程开发指南

第 - 92 - 页

4.6.4.3 编写主窗口源文件 main_form.cpp

接下来用 vi 编辑器创建并打开 main_form.cpp 文件:

# vi main_form.cpp

在 vi 编辑器中输入如下源代码内容:

#include "main_form.h"

#include <qlabel.h>

#include <qpushbutton.h>

#include <qlayout.h>

#include <qspinbox.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/ioctl.h>

#include <fcntl.h>

#include <qapplication.h>

#define PWM_IOCTL_SET_FREQ 1

#define PWM_IOCTL_STOP 0

TMainForm::TMainForm(QWidget * parent, const char * name, WFlags f)

: TMainFormBase(parent, name, f)

{

m_fd = ::open("/dev/pwm", O_RDONLY);

::ioctl(m_fd, PWM_IOCTL_STOP);

connect(m_startButton, SIGNAL(clicked()), this, SLOT(buttonClicked()) );

connect(m_stopButton, SIGNAL(clicked()), this, SLOT(buttonClicked()) );

connect(m_closeButton, SIGNAL(clicked()), this, SLOT(buttonClicked()) );

}

TMainForm::~TMainForm()

{

::ioctl(m_fd, PWM_IOCTL_STOP);

::close(m_fd);

}

Page 93: Mini6410 Qt4和Qtopia编程开发指南

第 - 93 - 页

void TMainForm::buttonClicked()

{

QPushButton* obj = (QPushButton*)sender();

if (obj == m_startButton) {

::ioctl(m_fd, PWM_IOCTL_SET_FREQ, 1000);

} else if (obj == m_stopButton) {

::ioctl(m_fd, PWM_IOCTL_STOP);

} else if (obj == m_closeButton) {

close();

}

}

上述源代码的主要功能在 4.6.2 如何控制蜂鸣器发声 这一章节中已经详细描述,上述代码中我

在代码中写死了只按 1000 的频率令蜂鸣器发声,读者可扩展此程序的功能,使它可以灵活控制发声

的频率。

4.6.4.4 编写项目文件 pwm-testing.pro

源代码写完了,在编译之前,还得再写一个 pwm-testing.pro 项目文件。

接下来用 vi 编辑器创建并打开 pwm-testing.pro 文件:

# vi pwm-testing.pro

在 vi 编辑器中输入如下内容:

CONFIG += qtopiaapp

CONFIG -= buildQuicklaunch

HEADERS = main_form.h

SOURCES = main_form.cpp main.cpp

INTERFACES = main_form_base.ui

TARGET = pwm-testing

上面的项目文件中,CONFIG+=qtopiaapp 表示要编译的是一个 Qtopia 程序,HEADERS 和

SOURCES 列出了 pwm-testing 的源代码和头文件清单,而 TARGET 则指定最后生成的可执行文件

名为 pwm-testing, CONFIG-=buildQuicklaunch 的意思是需要编译成一个独立的可执行程序,而不是

应用程序插件。

Page 94: Mini6410 Qt4和Qtopia编程开发指南

第 - 94 - 页

4.6.5 交叉编译 pwm-testing 程序

请参考 5.1.2 章节在项目目录创建一个 ARM 版本的编译脚本 buildarm.sh,然后执行该脚本编

译 pwm-testing :

# ./buildarm.sh

编译完成后,在 pwm-testing 下生成了 pwm-testing 可执行文件,把它拷贝到 SD 卡,然后将 SD

插到 mini6410 开发板上,在串口终端上输入以下命令将可执行文件拷贝到开发板上的

/opt/Qtopia/bin/ 目录下:

@# cp /sdcard/pwm-testing /opt/Qtopia/bin/

@# chmod +x /opt/Qtopia/bin/pwm-testing

4.6.6 在 Qtopia 上添加 pwm-testing 程序图标

要在 Qtopia 上增加图标,需要编写一个 desktop 文件,还需要设计一个图标作为程序的图标,

图标的格式需要是 png 格式的图像文件,像素建议用 48x48 像素的图标),请读者自行用 Photoshop

或者 GIMP 等图形工具设计图标,这里不对图标的制作过程进行描述。

不想设计图标的读者可以在 Fedora9 系统下的以下目录:/usr/share/icons/hicolor/48x48/apps/

寻找一个相似的图标来使用,或者上网访问 http://www.iconpng.com 网址搜索并下载一个图标,注

意要下载 png 格式的。

图标制作或者找到现成的后,将其命名为 pwm-testing.png,并复制用

/opt/mini6410/qtopia2_apps/pwm-testing/目录下。

接着我们编写一个 desktop 文件:

# cd /opt/mini6410/qtopia2_apps/pwm-testing/

# vi pwm-testing.desktop

在 vi 中输入以下内容并保存:

[Translation]

File=QtopiaSettings

Context=pwm-testing

Comment[Desktop Entry/Name]=Use soft hyphen (char U00AD) to indicate

hyphenation

[Desktop Entry]

Page 95: Mini6410 Qt4和Qtopia编程开发指南

第 - 95 - 页

Exec=pwm-testing

Icon=pwm-testing

Type=Application

Name[]=PWM-Testing

CanFastload=0

把 pwm-testing.png 和 pwm-testing.desktop 这两个文件放入 SD 卡,然后将 SD 卡插到

mini6410 开发板上,在串口终端上执下以下命令,把这两个文件拷贝到 Qtopia 目录的相应位置:

@# cp /sdcard/pwm-testing.desktop /opt/Qtopia/apps/Applications/

@# cp /sdcard/pwm-testing.png /opt/Qtopia/pics/

完成后重启开发板,应该可以看到应用程序图标了,以后就可以通过点击图标启动程序了,至此,

pwm-testing 程序就算开发完成了。

4.6.7 运行 pwm-testing 程序

要运行 pwm-testing 程序,只要在 Applications 中找到 pwm-testing 应用程序图标并点击即可,运行

结果如下图所示:

Page 96: Mini6410 Qt4和Qtopia编程开发指南

第 - 96 - 页

要令蜂鸣器发声,点击 Start 即可,要停止发声,点击 Stop,点 Close 将退出程序。

4.7 按键测试程序的开发

4.7.1 本示例的设计目的

本实例的目的是演示如何在 Qtopia2.2.0中编写一个按键测试程序,该程序用于测试开发板上的 Hard

Key 是否 OK,读者可以通过该示例了解到如何在 Qtopia2.2.0 中访问 Hard Key硬件设备,读取 Hard Key

按键的状态等等。

在 /opt/qtopia2_apps 目录下创建 button-testing作为本示例的项目目录,在终端上输入如下命

令:

# mkdir –p /opt/mini6410/qtopia2_apps/button-testing

Page 97: Mini6410 Qt4和Qtopia编程开发指南

第 - 97 - 页

4.7.2 按键测试程序的原理

Mini6410 开发板总共有 8 个用户测试用按键,它们的位置如下图所示,8 个按键分别标

记为 K1 ~ K8:

要获得这 8 个按键的状态,只要读取 /dev/buttons 这个设备文件即可,下面的代码演示了如何打开

/dev/buttons 设备,并读取一次按键的状态:

fd = ::open("/dev/buttons", O_RDONLY);

char buffer[8];

memset(buffer, 0, sizeof buffer);

::read(fd, buffer, sizeof buffer);

如上述代码所示,每次从 /dev/buttons 中读取 8 个字节,每个字节分别代表所对应的按键的状态值,

当状态值最低位为 1 时,表示该按键被按下,所以,接着上面的代码,如果要判断 K5 键是否被按下,

只要进行如下判断即可:

if (buffer[4] & 0x01) {

}

如果要一直监听按键的状态,那么就需要实现轮询机制了,用 C 语言进行编程时,可以使用 select 函

数来监听 /dev/buttons 设备,而用 Qt 进行编程时,我们可以使用 Qt 的类 QSocketNofitier 来监听 (关于

QSocketNofitier 类的作用,可以参考章节 4.5.1.2)。

下面将一步步来创建这个测试程序。

Page 98: Mini6410 Qt4和Qtopia编程开发指南

第 - 98 - 页

4.7.3 使用 designer 工具设计图形界面

输入如下命令启动 designer 工具,并以 main_form_base.ui 为了主界面 ui 的文件名:

# cd /opt/mini6410/qtopia2_apps/button-testing

# /opt/mini6410/qtopia-free-2.2.0/qt2/bin/designer main_form_base.ui

在弹出的 New Form 界面中,选择“Widget”然后点击”OK“,我们将创建一个基于 QWidget 的窗

体而不是 QDialog 或其它:

这时,将会显示窗口的编辑画面,我们需要修改窗口的大小,使得 3.5 寸的屏幕也能完整显示我

们的程序,并且需要修改窗口标题, 请参考下图的提示修改窗口的属性值:

Page 99: Mini6410 Qt4和Qtopia编程开发指南

第 - 99 - 页

完成窗口属性的设置后,界面的就设计完毕了,本示例不需要放置控件,我将在程序中演示直接

在窗口上面绘制图像的方式显示按键状态。

4.7.4 编写代码

现在开始为 button-testing 编写代码,我们需要创建三个源代码文件,一个是头文件 main_form.h,

一个是源代码文件 main_form.cpp,一个是 main.cpp,分别在以下章节中创建这些文件。

4.7.4.1 编写程序入口 main.cpp

首先用 vi 编辑器创建并打开 main.cpp 文件:

# vi main.cpp

Page 100: Mini6410 Qt4和Qtopia编程开发指南

第 - 100 - 页

在 vi 编辑器中输入如下源代码内容:

#include "main_form.h"

#include <qtopia/qpeapplication.h>

QTOPIA_ADD_APPLICATION("button-testing",TMainForm)

QTOPIA_MAIN

main.cpp 只有 4 行源代码,它的实现很简单,宏展开后会是一个 main 函数,然后创建

QPEApplication 对象 和 TMainForm 主窗口对象,最后显示主窗口并执行 QApplication::exec()进入

事件循环。

main.cpp 所用到的头文件 main_form.h 和 TMainForm 类到目前为止还不存在,我们接下来就要

新建它们。

4.7.4.2 编写主窗口头文件 main_form.h

接下来用 vi 编辑器创建并打开 main_form.h 文件:

# vi main_form.h

在 vi 编辑器中输入如下源代码内容:

#if !defined (__MAIN_FORM_H__)

# define __MAIN_FORM_H__

#include "main_form_base.h"

class QSocketNotifier;

class TMainForm: public TMainFormBase {

Q_OBJECT

public:

TMainForm(QWidget * parent = 0, const char * name = 0, WFlags f = WType_TopLevel);

virtual ~TMainForm();

protected:

void paintEvent(QPaintEvent* e);

private slots:

void buttonClicked();

private:

int m_fd;

Page 101: Mini6410 Qt4和Qtopia编程开发指南

第 - 101 - 页

QSocketNotifier* m_notifier;

bool m_oldButtonsState[6];

};

#endif

main_form.h 文件中包含了 main_form_base.h 头文件,这个 main_form_base.h 头文件不需要

用户编写,编译时由 uic 编译器根据 main_form_base.ui 文件自动生成的,main_form_base.h 文件

的代码实现了界面的基类 TMainFormBase, 因此,要使用我们自已用 designer 设计的程序界面,我

们只需将主窗口 TMainForm 从 TMainFormBase 类继承即可。

我们在 TMainForm 类中声明了三个成员变量,m_fd 用于/dev/buttons 设备的句柄,m_notifier

用于监听/dev/buttons 设备的可写状态,而 m_oldButtonsState[8]是一个 bool 类型数组,用于保存按

键上一次的状态(是否按下)。我们还重载了 QWidget 的 paintEvent 方法,用于在窗口客户区绘制

按键的状态。

4.7.4.3 编写主窗口源文件 main_form.cpp

接下来用 vi 编辑器创建并打开 main_form.cpp 文件:

# vi main_form.cpp

在 vi 编辑器中输入如下源代码内容:

#include "main_form.h"

#include <qlabel.h>

#include <qpushbutton.h>

#include <qlayout.h>

#include <qspinbox.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/ioctl.h>

#include <fcntl.h>

#include <qapplication.h>

#include <qmessagebox.h>

#include <qsocketnotifier.h>

Page 102: Mini6410 Qt4和Qtopia编程开发指南

第 - 102 - 页

#include <qpainter.h>

TMainForm::TMainForm(QWidget * parent, const char * name, WFlags f)

: TMainFormBase(parent, name, f)

{

m_fd = ::open("/dev/buttons", O_RDONLY | O_NONBLOCK);

if (m_fd < 0) {

QMessageBox::information(this,"Error", "Fail to open /dev/buttons.");

return;

}

memset(m_oldButtonsState, 0, sizeof m_oldButtonsState);

m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);

connect (m_notifier, SIGNAL(activated(int)), this, SLOT(buttonClicked()));

}

TMainForm::~TMainForm()

{

delete m_notifier;

::close(m_fd);

}

void TMainForm::buttonClicked()

{

char buffer[8];

memset(buffer, 0, sizeof buffer);

::read(m_fd, buffer, sizeof buffer);

for (unsigned i = 0; i < sizeof buffer / sizeof buffer[0]; i++) {

bool wasOn = m_oldButtonsState[i];

bool isOn = (buffer[i] & 0x01);

if (wasOn != isOn) {

m_oldButtonsState[i] = isOn;

update();

}

}

}

void TMainForm::paintEvent(QPaintEvent*)

{

Page 103: Mini6410 Qt4和Qtopia编程开发指南

第 - 103 - 页

QPainter p(this);

int x = 10;

int y = 10;

const int w = 20;

const int h = 20;

const int space = 5;

QString buttonText;

for (int i = 0; i < 8; i++) {

buttonText = buttonText.sprintf( "K%d", i+1 );

if (m_oldButtonsState[i]) {

p.fillRect(x,y,w,h,QBrush(QColor("#000000")));

p.setPen( QColor("#FFFFFF") );

} else {

p.setPen( QColor("#000000") );

p.drawRect(x,y,w,h);

}

p.drawText(x,y,w,h,Qt::AlignCenter,buttonText);

x += w + space;

if (x+w >= width()) {

x = 10;

y += h + space;

}

}

}

上述代码的源理是比较简单的,我们首先打开 /dev/buttons 设备,然后用 QSocketNotifier 对

象监听它,当有按键按下时,buttonClicked 函数(slot)会被调用,在 buttonClicked 函数中,我们读取

所有按键的状态,并与上一次的状态作比较,如果有不同,则调用 update()请求重新绘制按键的状态

(重新绘制窗口)。

update()的请求被触发时,窗口的绘制函数 paintEvent 会得到调用,我们在 paintEvent 函数中

绘制用于反映按键状态的图像。

4.7.4.4 编写项目文件 button-testing.pro

源代码写完了,在编译之前,还得再写一个 button-testing.pro 项目文件。

Page 104: Mini6410 Qt4和Qtopia编程开发指南

第 - 104 - 页

接下来用 vi 编辑器创建并打开 button-testing.pro 文件:

# vi button-testing.pro

在 vi 编辑器中输入如下内容:

CONFIG += qtopiaapp

CONFIG -= buildQuicklaunch

HEADERS = main_form.h

SOURCES = main_form.cpp main.cpp

INTERFACES = main_form_base.ui

TARGET = button-testing

上面的项目文件中,CONFIG+=qtopiaapp 表示要编译的是一个 Qtopia 程序,HEADERS 和

SOURCES 列出了 button-testing 的源代码和头文件清单,而 TARGET 则指定最后生成的可执行文件

名为 button-testing, CONFIG-=buildQuicklaunch 的意思是需要编译成一个独立的可执行程序,而不

是应用程序插件。

4.7.5 交叉编译 button-testing 程序

请参考 5.1.2 章节在项目目录创建一个 ARM 版本的编译脚本 buildarm.sh,然后执行该脚本编

译 button-testing :

# ./buildarm.sh

编译完成后,在 button-testing 下生成了 button-testing 可执行文件,把它拷贝到 SD 卡,然后将

SD 插到 mini6410 开发板上,在串口终端上输入以下命令将可执行文件拷贝到开发板上的

/opt/Qtopia/bin/ 目录下:

@# cp /sdcard/button-testing /opt/Qtopia/bin/

@# chmod +x /opt/Qtopia/bin/button-testing

4.7.6 在 Qtopia 上添加 button-testing 程序图标

要在 Qtopia 上增加图标,需要编写一个 desktop 文件,还需要设计一个图标作为程序的图标,

图标的格式需要是 png 格式的图像文件,像素建议用 48x48 像素的图标),请读者自行用 Photoshop

或者 GIMP 等图形工具设计图标,这里不对图标的制作过程进行描述。

不想设计图标的读者可以在 Fedora9 系统下的以下目录:/usr/share/icons/hicolor/48x48/apps/

Page 105: Mini6410 Qt4和Qtopia编程开发指南

第 - 105 - 页

寻找一个相似的图标来使用,或者上网访问 http://www.iconpng.com 网址搜索并下载一个图标,注

意要下载 png 格式的。

图标制作或者找到现成的后,将其命名为 button-testing.png,并复制用

/opt/mini6410/qtopia2_apps/button-testing/目录下。

接着我们编写一个 desktop 文件:

# cd /opt/mini6410/qtopia2_apps/button-testing/

# vi button-testing.desktop

在 vi 中输入以下内容并保存:

[Translation]

File=QtopiaSettings

Context=button-testing

Comment[Desktop Entry/Name]=Use soft hyphen (char U00AD) to indicate

hyphenation

[Desktop Entry]

Exec=button-testing

Icon=button-testing

Type=Application

Name[]=Button-Testing

CanFastload=0

把 button-testing.png 和 button-testing.desktop 这两个文件放入 SD 卡,然后将 SD 卡插到

mini6410 开发板上,在串口终端上执下以下命令,把这两个文件拷贝到 Qtopia 目录的相应位置:

@# cp /sdcard/button-testing.desktop /opt/Qtopia/apps/Applications/

@# cp /sdcard/button-testing.png /opt/Qtopia/pics/

完成后重启开发板,应该可以看到应用程序图标了,以后就可以通过点击图标启动程序了,至此,

button-testing 程序就算开发完成了。

4.7.7 button-testing 程序的运行

要运行 button-testing 程序,只要在 Applications 中找到 button-testing 应用程序图标并点击即可,运行

结果如下图所示:

Page 106: Mini6410 Qt4和Qtopia编程开发指南

第 - 106 - 页

界面上显示了 K1~K8 按键的状态,当按键被按下时,相应的按键会显示为黑色底,例如在上图中,

用户按下了 K2 这个按键。

4.8 ADC 测试程序的开发

4.8.1 本示例的设计目的

本实例编写一个 A/D转换的测试程序。

在 /opt/qtopia2_apps 目录下创建 adc-testing作为本示例的项目目录,在终端上输入如下命令:

# mkdir –p /opt/mini6410/qtopia2_apps/adc-testing

Page 107: Mini6410 Qt4和Qtopia编程开发指南

第 - 107 - 页

4.8.2 A/D 转换测试程序的实现说明

使用如下代码,可以读取当前的 ADC 的值

int fd = ::open("/dev/adc", 0);

if (fd < 0) {

return;

}

char buffer[30] = "";

int len = ::read(fd, buffer, sizeof buffer -1);

if (len > 0) {

buffer[len] = '\0';

int value = -1;

sscanf(buffer, "%d", &value);

printf(“ADC: %d\n”, value);

}

::close(fd);

在下面的章节中,我们将完成这个 ADC 测试程序,但由于比较简单,本示例就不使用 designer

设计界面了,要了解 designer 的用法,可参考其它的示例。

4.8.3 编写代码

现在开始为 adc-testing 编写代码,我们需要创建三个源代码文件,一个是头文件 main_form.h,

一个是源代码文件 main_form.cpp,一个是 main.cpp,分别在以下章节中创建这些文件。

4.8.3.1 编写程序入口 main.cpp

首先用 vi 编辑器创建并打开 main.cpp 文件:

# vi main.cpp

在 vi 编辑器中输入如下源代码内容:

#include "main_form.h"

#include <qtopia/qpeapplication.h>

QTOPIA_ADD_APPLICATION("adc-testing",TMainForm)

QTOPIA_MAIN

main.cpp 只有 4 行源代码,它的实现很简单,宏展开后会是一个 main 函数,然后创建

Page 108: Mini6410 Qt4和Qtopia编程开发指南

第 - 108 - 页

QPEApplication 对象 和 TMainForm 主窗口对象,最后显示主窗口并执行 QApplication::exec()进入

事件循环。

main.cpp 所用到的头文件 main_form.h 和 TMainForm 类到目前为止还不存在,我们接下来就要

新建它们。

4.8.3.2 编写主窗口头文件 main_form.h

接下来用 vi 编辑器创建并打开 main_form.h 文件:

# vi main_form.h

在 vi 编辑器中输入如下源代码内容:

#if !defined (__MAIN_FORM_H__)

# define __MAIN_FORM_H__

#include <qwidget.h>

#include <qlcdnumber.h>

class TMainForm: public QWidget {

Q_OBJECT

public:

TMainForm(QWidget * parent = 0, const char * name = 0, WFlags f = WType_TopLevel);

virtual ~TMainForm() {}

protected:

void timerEvent (QTimerEvent *);

private:

QLCDNumber* m_label;

};

#endif

4.8.3.3 编写主窗口源文件 main_form.cpp

接下来用 vi 编辑器创建并打开 main_form.cpp 文件:

# vi main_form.cpp

在 vi 编辑器中输入如下源代码内容:

Page 109: Mini6410 Qt4和Qtopia编程开发指南

第 - 109 - 页

#include "main_form.h"

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/ioctl.h>

#include <fcntl.h>

#include <linux/fs.h>

#include <errno.h>

#include <string.h>

TMainForm::TMainForm(QWidget * parent, const char * name, WFlags f)

: QWidget(parent, name, f)

{

setCaption( "ADC-Testing" );

m_label = new QLCDNumber(this);

m_label->setGeometry(10,10, 100, 50);

m_label->setSegmentStyle(QLCDNumber::Flat);

startTimer(500);

}

void TMainForm::timerEvent ( QTimerEvent * )

{

int fd = ::open("/dev/adc", 0);

if (fd < 0) {

return;

}

char buffer[30] = "";

int len = ::read(fd, buffer, sizeof buffer -1);

if (len > 0) {

buffer[len] = '\0';

int value = -1;

sscanf(buffer, "%d", &value);

m_label->display(value);

}

::close(fd);

Page 110: Mini6410 Qt4和Qtopia编程开发指南

第 - 110 - 页

}

上述的源代码中,我们用 startTimer函数开启了一个 Timer,每 500 毫秒读取一次 ADC 的值,

然后将该值显示到窗口中的 QLCDNumber控件上。

4.8.3.4 编写项目文件 adc-testing.pro

源代码写完了,在编译之前,还得再写一个 adc-testing.pro 项目文件。

接下来用 vi 编辑器创建并打开 adc-testing.pro 文件:

# vi adc-testing.pro

在 vi 编辑器中输入如下内容:

CONFIG += qtopiaapp

CONFIG -= buildQuicklaunch

HEADERS = main_form.h

SOURCES = main_form.cpp main.cpp

TARGET = adc-testing

上面的项目文件中,CONFIG+=qtopiaapp 表示要编译的是一个 Qtopia 程序,HEADERS 和

SOURCES 列出了 adc-testing 的源代码和头文件清单,而 TARGET 则指定最后生成的可执行文件名

为 adc-testing, CONFIG-=buildQuicklaunch 的意思是需要编译成一个独立的可执行程序,而不是应

用程序插件。

4.8.4 交叉编译 adc-testing 程序

请参考 5.1.2 章节在项目目录创建一个 ARM 版本的编译脚本 buildarm.sh,然后执行该脚本编

译 adc-testing :

# ./buildarm.sh

编译完成后,在 adc-testing 下生成了 adc-testing 可执行文件,把它拷贝到 SD 卡,然后将 SD

插到 mini6410 开发板上,在串口终端上输入以下命令将可执行文件拷贝到开发板上的

/opt/Qtopia/bin/ 目录下:

@# cp /sdcard/adc-testing /opt/Qtopia/bin/

@# chmod +x /opt/Qtopia/bin/adc-testing

Page 111: Mini6410 Qt4和Qtopia编程开发指南

第 - 111 - 页

4.8.5 在 Qtopia 上添加 adc-testing 程序图标

要在 Qtopia 上增加图标,需要编写一个 desktop 文件,还需要设计一个图标作为程序的图标,

图标的格式需要是 png 格式的图像文件,像素建议用 48x48 像素的图标),请读者自行用 Photoshop

或者 GIMP 等图形工具设计图标,这里不对图标的制作过程进行描述。

不想设计图标的读者可以在 Fedora9 系统下的以下目录:/usr/share/icons/hicolor/48x48/apps/

寻找一个相似的图标来使用,或者上网访问 http://www.iconpng.com 网址搜索并下载一个图标,注

意要下载 png 格式的。

图标制作或者找到现成的后,将其命名为 adc-testing.png,并复制用

/opt/mini6410/qtopia2_apps/adc-testing/目录下。

接着我们编写一个 desktop 文件:

# cd /opt/mini6410/qtopia2_apps/adc-testing/

# vi adc-testing.desktop

在 vi 中输入以下内容并保存:

[Translation]

File=QtopiaSettings

Context=adc-testing

Comment[Desktop Entry/Name]=Use soft hyphen (char U00AD) to indicate

hyphenation

[Desktop Entry]

Exec=adc-testing

Icon=adc-testing

Type=Application

Name[]=ADC-Testing

CanFastload=0

把 adc-testing.png 和 adc-testing.desktop 这两个文件放入 SD 卡,然后将 SD 卡插到

mini6410 开发板上,在串口终端上执下以下命令,把这两个文件拷贝到 Qtopia 目录的相应位置:

@# cp /sdcard/adc-testing.desktop /opt/Qtopia/apps/Applications/

@# cp /sdcard/adc-testing.png /opt/Qtopia/pics/

完成后重启开发板,应该可以看到应用程序图标了,以后就可以通过点击图标启动程序了,至此,

Page 112: Mini6410 Qt4和Qtopia编程开发指南

第 - 112 - 页

adc-testing 程序就算开发完成了。

4.8.6 ADC 测试程序的运行

在 Applications 中找到 adc-testing 应用程序图标并点击,运行结果如下图所示:

4.9 LED 测试程序的开发

4.9.1 本示例的设计目的

本实例的目的是演示如何在 Qtopia2.2.0中编写一个 LED测试程序,该程序用于测试开发板上的 LED

是否 OK,同时,读者可以通过该示例了解到如何在 Qtopia2.2.0 中访问 LED硬件设备,设置 LED的状态等

等。

在 /opt/qtopia2_apps 目录下创建 led-testing作为本示例的项目目录,在终端上输入如下命令:

# mkdir –p /opt/mini6410/qtopia2_apps/led-testing

Page 113: Mini6410 Qt4和Qtopia编程开发指南

第 - 113 - 页

4.9.2 LED 状态设置的原理说明

mini6410 开发板具有 4 个用户可编程 LED,要对 LED 进行操作,首先需要打开/dev 下的 LED 设备

文件,代码如下所示,为了更好的兼容早期版本的 kernel,我们选择首选尝试打开 /dev/leds0 设置,不成

功能才去尝试 /dev/leds,只有两个设备都打开失败时才视为失败:

int fd = ::open("/dev/leds0", O_RDONLY);

if (fd < 0) {

fd = ::open("/dev/leds", O_RDONLY);

}

用下面的代码操作 LED 亮还是灭,其中,1 表示亮,0 表示灭,n 表示要操作哪一个 LED(由于只有

4 个 LED,因此 n 取值范围为 0 ~ 3):

#define ON 1

#define OFF 0

ioctl(fd,ON, n);

退出程序前,记得关闭 LED 设备,使用以下代码:

::close(fd);

由于 mini6410 开机时,自动启动了一个 led player 的服务用于显示 LED 的走马灯的效果,因此

在操作 LED 之前,我们首先需要终止 led player 进程,可使用以下代码终止:

::system("kill -s STOP `pidof led-player`");

下面将一步步来创建这个测试程序。

4.9.3 使用 designer 工具设计图形界面

输入如下命令启动 designer 工具,并以 main_form_base.ui 为了主界面 ui 的文件名:

# cd /opt/mini6410/qtopia2_apps/led-testing

# /opt/mini6410/qtopia-free-2.2.0/qt2/bin/designer main_form_base.ui

在弹出的 New Form 界面中,选择“Widget”然后点击”OK“,我们将创建一个基于 QWidget 的窗

体而不是 QDialog 或其它:

Page 114: Mini6410 Qt4和Qtopia编程开发指南

第 - 114 - 页

这时,将会显示窗口的编辑画面,我们需要修改窗口的大小,使得 3.5 寸的屏幕也能完整显示我

们的程序,并且需要修改窗口标题, 请参考下图的提示修改窗口的属性值:

在窗口中放置 4 个 Check Box 控件,如下所示:

Page 115: Mini6410 Qt4和Qtopia编程开发指南

第 - 115 - 页

按照下图的提示,分别设置这 4 个 Check Box 控件的属性,我们将 4 个 Check Box 的 name 属

性分别设置为 m_led1 ~ m_led4, 将 text 属性分别设置为 LED 1 ~ LED 4:

Page 116: Mini6410 Qt4和Qtopia编程开发指南

第 - 116 - 页

Page 117: Mini6410 Qt4和Qtopia编程开发指南

第 - 117 - 页

Page 118: Mini6410 Qt4和Qtopia编程开发指南

第 - 118 - 页

4.9.4 编写代码

现在开始为 led-testing 编写代码,我们需要创建三个源代码文件,一个是头文件 main_form.h,

一个是源代码文件 main_form.cpp,一个是 main.cpp,分别在以下章节中创建这些文件。

4.9.4.1 编写程序入口 main.cpp

首先用 vi 编辑器创建并打开 main.cpp 文件:

# vi main.cpp

在 vi 编辑器中输入如下源代码内容:

#include "main_form.h"

#include <qtopia/qpeapplication.h>

QTOPIA_ADD_APPLICATION("led-testing",TMainForm)

QTOPIA_MAIN

main.cpp 只有 4 行源代码,它的实现很简单,宏展开后会是一个 main 函数,然后创建

QPEApplication 对象 和 TMainForm 主窗口对象,最后显示主窗口并执行 QApplication::exec()进入

事件循环。

main.cpp 所用到的头文件 main_form.h 和 TMainForm 类到目前为止还不存在,我们接下来就要

新建它们。

4.9.4.2 编写主窗口头文件 main_form.h

接下来用 vi 编辑器创建并打开 main_form.h 文件:

# vi main_form.h

在 vi 编辑器中输入如下源代码内容:

#if !defined (__MAIN_FORM_H__)

# define __MAIN_FORM_H__

#include "main_form_base.h"

class TMainForm: public TMainFormBase {

Page 119: Mini6410 Qt4和Qtopia编程开发指南

第 - 119 - 页

Q_OBJECT

public:

TMainForm(QWidget * parent = 0, const char * name = 0, WFlags f = WType_TopLevel);

virtual ~TMainForm();

private slots:

void checkBoxClicked();

private:

int m_fd;

};

#endif

main_form.h 文件中包含了 main_form_base.h 头文件,这个 main_form_base.h 头文件不需要

用户编写,编译时由 uic 编译器根据 main_form_base.ui 文件自动生成的,main_form_base.h 文件

的代码实现了界面的基类 TMainFormBase, 因此,要使用我们自已用 designer 设计的程序界面,我

们只需将主窗口 TMainForm 从 TMainFormBase 类继承即可。

我们在 TMainForm 类中声明了一个成员变量 m_fd ,用于存储/dev/led 设备的句柄,声明了一

个 slot 函数 checkBoxClicked(), 用于处理用户点击 checkBox 的事件。

4.9.4.3 编写主窗口源文件 main_form.cpp

接下来用 vi 编辑器创建并打开 main_form.cpp 文件:

# vi main_form.cpp

在 vi 编辑器中输入如下源代码内容:

#include "main_form.h"

#include <qcheckbox.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/ioctl.h>

#include <fcntl.h>

Page 120: Mini6410 Qt4和Qtopia编程开发指南

第 - 120 - 页

TMainForm::TMainForm(QWidget * parent, const char * name, WFlags f)

: TMainFormBase(parent, name, f)

{

::system("kill -s STOP `pidof led-player`");

m_fd = ::open("/dev/leds0", O_RDONLY);

if (m_fd < 0) {

m_fd = ::open("/dev/leds", O_RDONLY);

}

connect(m_led1, SIGNAL(clicked()), this, SLOT(checkBoxClicked()) );

connect(m_led2, SIGNAL(clicked()), this, SLOT(checkBoxClicked()) );

connect(m_led3, SIGNAL(clicked()), this, SLOT(checkBoxClicked()) );

connect(m_led4, SIGNAL(clicked()), this, SLOT(checkBoxClicked()) );

checkBoxClicked();

}

TMainForm::~TMainForm()

{

::close(m_fd);

}

void TMainForm::checkBoxClicked()

{

ioctl(m_fd, int(m_led1->isChecked()), 0);

ioctl(m_fd, int(m_led2->isChecked()), 1);

ioctl(m_fd, int(m_led3->isChecked()), 2);

ioctl(m_fd, int(m_led4->isChecked()), 3);

}

上述源代码中,由于 mini6410 开机时,自动启动了一个 led player 的服务用于显示 LED 的走马

灯的效果,因此,要操作 LED,我们首先需要终止 led player 进程,然后等待当用户点击 check Box

按钮,当用户点击 check box 时,checkBoxClicked()函数会被调用,会根据 check box 的状态

设置 LED是亮还是灭。

4.9.4.4 编写项目文件 led-testing.pro

源代码写完了,在编译之前,还得再写一个 led-testing.pro 项目文件。

Page 121: Mini6410 Qt4和Qtopia编程开发指南

第 - 121 - 页

接下来用 vi 编辑器创建并打开 led-testing.pro 文件:

# vi led-testing.pro

在 vi 编辑器中输入如下内容:

CONFIG += qtopiaapp

CONFIG -= buildQuicklaunch

HEADERS = main_form.h

SOURCES = main_form.cpp main.cpp

INTERFACES = main_form_base.ui

TARGET = led-testing

上面的项目文件中,CONFIG+=qtopiaapp 表示要编译的是一个 Qtopia 程序,HEADERS 和

SOURCES 列出了 led-testing 的源代码和头文件清单,而 TARGET 则指定最后生成的可执行文件名

为 led-testing, CONFIG-=buildQuicklaunch 的意思是需要编译成一个独立的可执行程序,而不是应

用程序插件。

4.9.5 交叉编译 led-testing 程序

请参考 5.1.2 章节在项目目录创建一个 ARM 版本的编译脚本 buildarm.sh,然后执行该脚本编

译 led-testing :

# ./buildarm.sh

编译完成后,在 led-testing 下生成了 led-testing 可执行文件,把它拷贝到 SD 卡,然后将 SD 插

到 mini6410 开发板上,在串口终端上输入以下命令将可执行文件拷贝到开发板上的 /opt/Qtopia/bin/

目录下:

@# cp /sdcard/led-testing /opt/Qtopia/bin/

@# chmod +x /opt/Qtopia/bin/led-testing

4.9.6 在 Qtopia 上添加 led-testing 程序图标

要在 Qtopia 上增加图标,需要编写一个 desktop 文件,还需要设计一个图标作为程序的图标,

图标的格式需要是 png 格式的图像文件,像素建议用 48x48 像素的图标),请读者自行用 Photoshop

或者 GIMP 等图形工具设计图标,这里不对图标的制作过程进行描述。

不想设计图标的读者可以在 Fedora9 系统下的以下目录:/usr/share/icons/hicolor/48x48/apps/

Page 122: Mini6410 Qt4和Qtopia编程开发指南

第 - 122 - 页

寻找一个相似的图标来使用,或者上网访问 http://www.iconpng.com 网址搜索并下载一个图标,注

意要下载 png 格式的。

图标制作或者找到现成的后,将其命名为 led-testing.png,并复制用

/opt/mini6410/qtopia2_apps/led-testing/目录下。

接着我们编写一个 desktop 文件:

# cd /opt/mini6410/qtopia2_apps/led-testing/

# vi led-testing.desktop

在 vi 中输入以下内容并保存:

[Translation]

File=QtopiaSettings

Context=led-testing

Comment[Desktop Entry/Name]=Use soft hyphen (char U00AD) to indicate

hyphenation

[Desktop Entry]

Exec=led-testing

Icon=led-testing

Type=Application

Name[]=Led-testing

CanFastload=0

把 led-testing.png 和 led-testing.desktop 这两个文件放入SD卡,然后将 SD 卡插到 mini6410

开发板上,在串口终端上执下以下命令,把这两个文件拷贝到 Qtopia 目录的相应位置:

@# cp /sdcard/led-testing.desktop /opt/Qtopia/apps/Applications/

@# cp /sdcard/led-testing.png /opt/Qtopia/pics/

完成后重启开发板,应该可以看到应用程序图标了,以后就可以通过点击图标启动程序了,至此,

led-testing 程序就算开发完成了。

4.9.7 led-testing 程序的运行

要运行 led-testing 程序,只要在 Applications 中找到 led-testing 应用程序图标并点击即可,运行结果

如下图所示:

Page 123: Mini6410 Qt4和Qtopia编程开发指南

第 - 123 - 页

Page 124: Mini6410 Qt4和Qtopia编程开发指南

第 - 124 - 页

第五章 附录

5.1 Qtopia 2.2.0 应用程序的编译脚本

5.1.1 PC 版本编译脚本 buildhost.sh

为了方便编译,我们编写一个脚本 buildhost.sh 来执行 PC 版本的编译工作,请用 cd 命令切换到

你要编译的应用程序目录,然后执下如下操作创建并编写编译脚本:

# vi buildhost.sh

在 vi 编辑器中输入如下内容:

#!/bin/sh

source /opt/qtopia-free-2.2.0/setQpeEnv

qmake -o Makefile.host -spec qws/linux-generic-g++ *.pro

make -f Makefile.host clean

make -f Makefile.host

执行以下命令给脚本设置可执行权限:

# chmod +x buildhost.sh

要编译时,在程序目录下执行以下命令即可:

# ./buildhost.sh

上面的编译脚本需要使用/opt/下的 qtopia-free-2.2.0/,如果你还没有编译过 x86 版本的

qtopia-free-2.2.0,请参考章节 3.2.2 进行编译。

如果你想使用友善之臂提供的 Qtopia2.2.0 进行编译,请将/opt/qtopia-free-2.2.0/修改为

/opt/FriendlyARM/mini6410/linux/x86-qtopia/qtopia-2.2.0-FriendlyARM/。

Page 125: Mini6410 Qt4和Qtopia编程开发指南

第 - 125 - 页

5.1.2 ARM 版本编译脚本 buildarm.sh

为了方便编译,我们编写一个脚本 buildarm.sh 来执行 ARM 版本的编译工作,请用 cd 命令切换

到你要编译的 qtopia2.2.0 程序的目录,然后执下如下操作创建并编写编译脚本:

# vi buildarm.sh

在 vi 编辑器中输入如下内容:

#!/bin/sh

source /opt/mini6410/qtopia-free-2.2.0/setQpeEnv

qmake -spec qws/linux-arm-g++ -o Makefile.target *.pro

make -f Makefile.target clean

make -f Makefile.target

执行以下命令给脚本设置可执行权限:

# chmod +x buildarm.sh

要编译时,在程序目录下执行以下命令即可:

# ./buildarm.sh

上面的编译脚本需要使用/opt/mini6410 下的 qtopia-free-2.2.0/,如果你还没有编译过 arm 版本

的 qtopia-free-2.2.0,请参考章节 3.2.3 进行编译。

如果你想使用友善之臂提供的 Qtopia2.2.0 进行编译,请将/opt/mini6410/qtopia-free-2.2.0/修

改为/opt/FriendlyARM/mini6410/linux/arm-qtopia/qtopia-2.2.0-FriendlyARM/。

5.2 Qt4 和 Qtopia 实用技巧

5.2.1 如何开机自动运行 Qt4 程序?

以要开机自动运行章节 4.2 编写的 HelloQt4 程序为例,修改 /etc/init.d/rcS 文件:

@# vi /etc/init.d/rcS

把文件中的:

Page 126: Mini6410 Qt4和Qtopia编程开发指南

第 - 126 - 页

/bin/qtopia &

改成:

. setqt4env

HelloQt4 –qws&

然后重启开发板即可。

(注意:setqt4env 脚本是需要自行编写的,请参考章节 4.2)

5.2.2 如何开机自动运行 Qtopia4.4.3?

修改 /etc/init.d/rcS文件:

@# vi /etc/init.d/rcS

把文件中的:

/bin/qtopia &

改成:

/bin/qtopia4 &

然后重启开发板即可。

5.2.3 如何在 Qtopia2.2.0 中添加自定义程序组?

本章节我们将创建一个程序组 MyApps,并将前面的章节中创建的所有 Qtopia2.2.0 应用程序放到

MyApps 程序组中去。

首先,我们在/opt/mini6410/qtopia2_apps/下创建 MyApps 目录:

# mkdir –p /opt/mini6410/qtopia2_apps/MyApps/

然后,在 MyApps 目录下创建一个.directory 文件 (注意文件名前面有一个“.”):

# cd /opt/mini6410/qtopia2_apps/MyApps/

# vi .directory

在.directory 中输入以下内容:

Page 127: Mini6410 Qt4和Qtopia编程开发指南

第 - 127 - 页

[Translation]

File=QtopiaApps

Context=MyApps

[Desktop Entry]

Name[]=MyApps

Icon=MyApps

.directory 文件中的内容指定了程序组的显示名称为 MyApps 以及图标为 MyApps.png。

接着,将需要在 MyApps 程序组中显示的程序的 desktop 文件复制到 MyApps 下,在这里,我将我们

在前面的章节中创建的所有 qtopia2.2.0 应用程序的 desktop 文件都复制到 MyApps 下:

# cd /opt/mini6410/qtopia2_apps/

# cp ./serialport/serialport.desktop ./MyApps

# cp ./led-testing/led-testing.desktop ./MyApps

# cp ./button-testing/button-testing.desktop ./MyApps

# cp ./adc-testing/adc-testing.desktop ./MyApps

# cp ./mycalc/mycalc.desktop ./MyApps

# cp ./pwm-testing/pwm-testing.desktop ./MyApps

将 MyApps 目录打包:

# cd /opt/mini6410/qtopia2_apps/

# tar cvzf MyApps.tgz MyApps

然后将 MyApps.tgz 拷贝到 SD 卡上,把 SD 卡插到开发板上,然后将 MyApps.tgz 在/opt/Qtopia/apps

目录下解压:

@# cd /opt/Qtopia/apps/

@# tar xvzf /sdcard/MyApps.tgz

最后,如果需要更改程序组的图标,需要设计或者寻找一个图标将其命名为 MyApps.png,并用

SD 卡复制到开发板上的/opt/Qtopia/pics/目录下。

完成以上这些步骤之后,重启开发板,应该能看到 MyApps 程序组了,效果如下图所示:

Page 128: Mini6410 Qt4和Qtopia编程开发指南

第 - 128 - 页

5.2.4 如何开机自动运行 Qtopia2.2.0 中的单个程序?

以要开机自动运行章节 4.1 编写的 mycalc 程序为例,先为 mycalc程序编写一个运行脚本,我们

复制 qtopia脚本来改一下就行了:

@# cp /bin/qtopia /bin/auto_run_mycalc

@# vi /bin/auto_run_mycalc

在 vi 编辑器中,将 auto_run_mycalc 文件中的最后一行内容:

exec $QPEDIR/bin/qpe

更改成:

exec $QPEDIR/bin/mycalc -qws

再修改 /etc/init.d/rcS 文件:

@# vi /etc/init.d/rcS

Page 129: Mini6410 Qt4和Qtopia编程开发指南

第 - 129 - 页

把文件中的:

/bin/qtopia &

改成:

/bin/auto_run_mycalc &

然后重启开发板即可。

5.2.5 如何解决 Qtopia2.2.0 图标下有一条虚线的问题?

用原始的 Qtopia2.2.0 源代码编译出来的版本,在图标下会出现一条虚线,如下图中的“ADC-Testing”

图标底下的虚线,比较影响美观:

要去掉这条虚线,可能通过以下方法解决:打开./qt2/include/qconfig-qpe.h 文件

Page 130: Mini6410 Qt4和Qtopia编程开发指南

第 - 130 - 页

和./qtopia/src/qt/qconfig-qpe.h 文件,在里面增加以下内容即可:

#define QT_NO_QWS_GFX_SPEED