Presentation is loading. Please wait.

Presentation is loading. Please wait.

嵌入式用户图形界面编程 课程目的 了解嵌入式图形系统 掌握QT/E开发环境、关键技术 通过实例熟悉基于Qt/E的嵌入式GUI设计.

Similar presentations


Presentation on theme: "嵌入式用户图形界面编程 课程目的 了解嵌入式图形系统 掌握QT/E开发环境、关键技术 通过实例熟悉基于Qt/E的嵌入式GUI设计."— Presentation transcript:

1 嵌入式用户图形界面编程 课程目的 了解嵌入式图形系统 掌握QT/E开发环境、关键技术 通过实例熟悉基于Qt/E的嵌入式GUI设计

2 1、嵌入式图形系统简介 1.1 Linux图形系统的发展史
linux本身没有图形界面, linux现在的图形界面的实现只是linux下的应用程序实现的。

3 1、嵌入式图形系统简介 1.1 Linux图形系统的发展史
图形界面并不是linux 的一部分,linux只是一个基于命令行的操作系统linux和Xfree的关系就相当于当年的DOS和 WINDOWS3.0一样,windows3.0不是独立的操作系统,它只是 DOS的扩充,是DOS下的应用程序级别的系统,不是独立的操作系统,同样XFree只是linux下的一个应用程序 而已,不是系统的一部分。

4 1、嵌入式图形系统简介 1.1 Linux图形系统的发展史
但是X的存在可以方便用户使用电脑。WINDOWS95及以后的版本就不一样了,他们的图形界面是操作系统的一部分,图形界面在系统内核中就实现了,没有了图形界面 windows就不成为windows了,但linux却不一样,没有图形界面linux还是 linux,很多装linux的 WEB服务器就根本不装X服务器。这也是WINDOWS和linux的重要区别之一。

5 1、嵌入式图形系统简介 1.1 Linux图形系统的发展史 X Window:业界标准 Open Look:来自SUN与AT&T
Motif :来自IBM/HP的OSF CDE :UNIX的标准图形界面 QT : KDE 的开发基础 GNOME :信仰的产物

6 1、嵌入式图形系统简介 1.2 嵌入式图形系统的发展史
早期嵌入式系统功能简单,对图形用户界面需求并不是太大。而且当时的图形系统对硬件要求太高,在嵌入式上实现几乎没有可能。 后来,应市场需求产生一些高级GUI工具包,使得嵌入式linux下的图形开发成为可能,而且易于编写出更好、更漂亮的界面。

7 1、嵌入式图形系统简介 1.3 常用的几种嵌入式GUI工具包 紧缩的 X Window 系统 MicroWindows MiniGUI
OpenGUI Qt/ Embedded

8 1.3.1 TinyX TinyX,是标准X-Windows在嵌入式系统的小巧实现,作为一个图形环境,X-Windows是成功的,但由于在体系接口上的原因,限制了它对游戏、多媒体的 支持能力。

9 1.3.2 Microwindows Mirowindows是嵌入式系统中广为使用的一种图形用户接口,其官方网站是: MicroWindows,其主要特色在于提供了C/S体系结构,同时也提供了相对完善的图形功能。但却无任何硬件加速能力,图形引擎中也存在着许多未经优化的低效算法。

10 1.3.2 Microwindows Microwindows的核心基于显示设备接口,因此可移植行很好,microwindows有自己的Framebuffer,因此它并不局限于Linux开发平台,在eCos、FreeBSD、RTEMS等操作系统上都能很好地运行。 此外,Microwindows能在宿主机上仿真目标机。这意味着基于Linux的Microwindows应用程序的开发和调试可以在普通的个人电脑上进行,而不需要使用普通嵌入式软件的“宿主机-目标机”调试模式,从而大大加快了开发速度。 Mincrowindows是完全免费的一个用户图形系统。

11 1.3.3 MiniGUI MiniGUI是由北京飞漫软件技术有限公司主持的一个自由软件项目(遵循GPL条款),其目标是为基于Linux的实时嵌入式系统提供一个轻量级的图形用户界面支持系统。 MiniGUI为应用程序定义了一组轻量级的窗口和图形设备接口。利用这些接口,每个应用程序可以建立多个窗口,而且可以在这些窗口中绘制图形。用户也可以利用MiniGUI建立菜单、按钮、列表框等常见的GUI元素。

12 1.3.3 MiniGUI 用户可以将MiniGUI配置成“MiniGUI-Threads”或者“MiniGUI-Lite。

13 1.3.4 OpenGUI OpenGUI基于一个用汇编实现的x86图形内核,提供了一个高层的C/C++图形/窗口接口,它的资源消耗小,可移植性差,不支持多进程。

14 2,QT/E Qt/Embedded(简称QtE)是一个专门为嵌入式系统设计图形用户界面的工具包。Qt是挪威Trolltech软件公司的产品,它为各种系统提供图形用户界面的工具包,QtE就是Qt的嵌入式版本。

15 2,QT/E 注意:QT 与 QT/Embedded 的区别

16 2,QT/E

17 2.1 QT/E 特点 2.1.1 跨平台 可支持的平台包括: ◆ MS/Windows 95、Windows 98、WindowsNT 4.0、Windows 2000、Windows XP; ◆ Unix/X11 Linux、Sun Solaris、HP-UX、Compaq True64Unix、IBM AIX、SGI IRIX 和很多其它X11 平台; ◆ Macintoshi Mac OSX; ◆ 嵌入式的,包含有FramBuffer 的Linux 平台。

18 2.1 QT/E 特点 2.2.2 资源丰富 trolltech 的主页:http://www. trolltech.com/
支持匿名访问的FTP: ftp://ftp.trolltech.com 新闻组服务器:nntp.trolltech.com 非官方的Qt 文档中文翻译小组:

19 2.1 QT/E 特点 2.2.3 工具丰富 提供了构建(qmake)、可视化设计(uic和qdesigner)、国际化(linguist)、文档系统(assistant)等一系列非常好用的工具。尤其是文档系统,绝对可以称得上是出色。

20 2.1 QT/E 特点 2.2.4 丰富的API函数 Qt/Embedded 也可以看成是一组用于访问嵌入式设备的 Qt C++ API;
Qt/Embedded 的Qt/X11,Qt/Windows 和Qt/Mac版本提供的都是相同的API和工具。

21 2.1 QT/E 特点 2.2.5 运行需要资源少、功能强大 相对X窗口下的嵌入解决方案而言,
Qt/Embedded只要求一个较小的存储空间(Flash)和内存。Qt/Embedded可以运行在不同的处理器上部署的Linux系统,只要这个系统有一个线性地址的缓冲帧并支持C++的编译器。

22 2.1 QT/E 特点 2.2.6 功能可裁减 Qt/Embedded 提供了大约200个可配置的特征,

23 3,QTOPIA 3.1 简介 Qtopia是基于 Qt编写的一个用于手持设备的 用户信息管理软件,它集成了很多实用的程序。
市面上买到的预装 linux操作系统的 arm9开发版,开机后看到的图形界面多是qtopia。

24 3,QTOPIA 3.1 简介

25 QTOPIA or Other Application
3.2 QTE和Qtopia开发模型 Linux Kernel Frame-buffer QT/Embedded QT/X11 Xlib X Window Server QT API QTOPIA or Other Application

26 课堂回顾 1,什么是frameBuffer? 2,QT 与 QT/E 最大的不同? 3, QTOPIA与QT的关系?

27 4, QTE开发环境搭建 宿主机移植所需工具及环境变量声明: 工具软件 描述 变量声明 Tmake-1.11 生成Makefile文件
TMAKEDIR/TMAKEPATH /PATH Qt-x Qvfb-虚拟帧缓存工具 Uic-用户界面编辑器 Designer Qt 图形设计器 LD_LIBRARY_PATH_/PATH Qt-embedded-2.3.7 Qt库支持 libqte.so QTEDIR/LD_LIBRARY_PATH/PATH Qtopia-free-1.7.0 应用程序开发包 桌面环境 QPEDIR/LD_LIBRARY_PATH/PATH

28 4,QTE开发环境搭建 4.1 tmake 安装 tar xfvz tmake-1.11.tar.gz
mv tmake-1.11 tmake export TMAKEDIR=$PWD/tmake export TMAKEPATH=$TMAKEDIR/lib/qws/linux-generic-g++

29 4,QTE开发环境搭建 4.2 QT编译 tar xfvz qt-x11-2.3.2.tar.gz mv qt-2.3.2 qt-x11
cd qt-x11 export QTDIR=$PWD echo yes | ./configure -static -no-xft -no-opengl -no-sm make -C src/moc cp src/moc/moc bin make -C src make -C tools/designer make -C tools/qvfb cp tools/qvfb/qvfb bin strip bin/uic bin/moc bin/designer bin/qvfb

30 4,QTE开发环境搭建 4.3 QTE编译 tar xfvz qt-embedded-2.3.7.tar.gz
mv qt-2.3.7/ qt cp qt-x11/bin/?* qt/bin export QTDIR=$PWD/qt export QPEDIR=$PWD/qtopia export TMAKEDIR=$PWD/tmake export TMAKEPATH=$TMAKEDIR/lib/qws/linux-generic-g++ export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/bin:$PATH cd qt make clean cp ../qtopia/src/qt/qconfig-qpe.h src/tools/ (echo yes; echo yes ) |./configure -platform linux-generic-g++ -qconfig qpe -depths 16,24,32 make -C src

31 4,QTE开发环境搭建 4.4 QPE编译 tar xfvz qtopia-free-1.7.0.tar.gz
mv qtopia-free qtopia cd qtopia/src ./configure -platform linux-generic-g++ make

32 4,QTE开发环境搭建 4.5 运行

33 当在PC上模拟Qtopia的运行时,需要用到对应Qt版本的库文件,因此需要修改/etc/ld. so
当在PC上模拟Qtopia的运行时,需要用到对应Qt版本的库文件,因此需要修改/etc/ld.so.conf 文件以适应刚刚安装的Qt(Redhat安装时带有Qt库,但不适合我们最新安装的版本),修改后的ld.so.conf文件内容如下: /sbc2410/x86-qtopia/qt/lib /sbc2410/x86-qtopia/qtopia/lib /usr/kerberos/lib /usr/X11R6/lib /usr/lib/sane 修改完此文档后,为了让刚刚安装的库生效,必须运行ldconfig。 至此Qt的开发缓建已经建立。

34 (1)设置环境变量 export QTDIR=$PWD/qt export QPEDIR=$PWD/qtopia export TMAKEDIR=$PWD/tmake export TMAKEPATH=$TMAKEDIR/lib/qws/linux-generic-g++ export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/bin:$PATH (2)启动虚拟帧缓存 “$ qvfb &” 或“$ qvfb -width 640 –height 480 &” (3)运行qtopia qpe &

35 5,QTE开发关键技术 5.1 信号与插槽 信号和槽用于对象间的通讯。信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不相同的部分。

36 信号与插槽 回调技术特点: 他们不是类型安全的 其次回调和处理函数是非常强有力地联系在一起的

37 信号与插槽 信号与插槽机制特点: 类型安全 信号和槽是宽松地联系在一起的 速度慢

38 信号与插槽

39 信号与插槽

40 信号与插槽 一个最小的C++类声明如下: class Foo { public: Foo();
int value() const { return val; } void setValue( int ); private: int val; };

41 信号与插槽 一个小的Qt类如下: class Foo : public QObject { Q_OBJECT public: Foo();
int value() const { return val; } public slots: void setValue( int ); signals: void valueChanged( int ); private: int val; };

42 信号与插槽 槽可以由应用程序的编写者来实现。这里是Foo::setValue()的一个可能的实现:
void Foo::setValue( int v ) { if ( v != val ) { val = v; emit valueChanged(v); }

43 信号与插槽 把两个对象连接在一起的一种方法: Foo a, b;
connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int))); a.setValue( 79 ); // a == 79 b == 79 b.setValue( 11 ); // a == undefined b == 11 b.value();

44 信号与插槽 5.2 元对象编译器(MOC) 作用 MOC是用来专门处理QT对C++的扩展部分 用法

45 6,实例一 一、代码编辑 二、程序编译

46 #include <qapplication.h>
#include <qpushbutton.h> int main(int argc, char ** argv) { QApplication a(argc, argv); QPushButton hellobtn("Hello world!", 0); hellobtn.resize(100, 20); a.setMainWidget(&hellobtn); hellobtn.show(); return a.exec(); }

47 #include <qpushbutton.h>
#include <qapplication.h> #include <qpushbutton.h> int main(int argc, char ** argv) { QApplication a(argc, argv); QPushButton hellobtn("Hello world!", 0); hellobtn.resize(100, 20); a.setMainWidget(&hellobtn); hellobtn.show(); return a.exec(); }

48 int main(int argc, char ** argv)
#include <qapplication.h> #include <qpushbutton.h> int main(int argc, char ** argv) { QApplication a(argc, argv); QPushButton hellobtn("Hello world!", 0); hellobtn.resize(100, 20); a.setMainWidget(&hellobtn); hellobtn.show(); return a.exec(); }

49 #include <qapplication.h>
#include <qpushbutton.h> int main(int argc, char ** argv) { QApplication a(argc, argv); QPushButton hellobtn("Hello world!", 0); hellobtn.resize(100, 20); a.setMainWidget(&hellobtn); hellobtn.show(); return a.exec(); }

50 QPushButton hellobtn("Hello world!", 0);
#include <qapplication.h> #include <qpushbutton.h> int main(int argc, char ** argv) { QApplication a(argc, argv); QPushButton hellobtn("Hello world!", 0); hellobtn.resize(100, 20); a.setMainWidget(&hellobtn); hellobtn.show(); return a.exec(); }

51 #include <qapplication.h>
#include <qpushbutton.h> int main(int argc, char ** argv) { QApplication a(argc, argv); QPushButton hellobtn("Hello world!", 0); hellobtn.resize(100, 20); a.setMainWidget(&hellobtn); hellobtn.show(); return a.exec(); }

52 #include <qapplication.h>
#include <qpushbutton.h> int main(int argc, char ** argv) { QApplication a(argc, argv); QPushButton hellobtn("Hello world!", 0); hellobtn.resize(100, 20); a.setMainWidget(&hellobtn); hellobtn.show(); return a.exec(); }

53 #include <qapplication.h>
#include <qpushbutton.h> int main(int argc, char ** argv) { QApplication a(argc, argv); QPushButton hellobtn("Hello world!", 0); hellobtn.resize(100, 20); a.setMainWidget(&hellobtn); hellobtn.show(); return a.exec(); }

54 #include <qapplication.h>
#include <qpushbutton.h> int main(int argc, char ** argv) { QApplication a(argc, argv); QPushButton hellobtn("Hello world!", 0); hellobtn.resize(100, 20); a.setMainWidget(&hellobtn); hellobtn.show(); return a.exec(); }

55 6,实例一 二、程序编译 1,生成工程文件 Progen –o test.pro 2,生成Makefile
Tmake –o Makefile test.pro 3, 编译 make

56 6,实例二 一、工程创建 二、界面设计 三、代码编辑 四、程序编译

57 6,实例三(信号与槽) 一、工程创建 二、界面设计 三、代码编辑 四、程序编译

58 课堂回顾 1、怎样将信号连接到槽? 2、能否将多个槽连接到一个信号? 3、是否能将一个信号连接到其他信号?如果能,应该怎样操作?
4、如果编译器报告connect的参数错误,通常会是什么错误?

59 7,QT编程模式讨论 基本模式 子类继承模式 ui.h模式

60 基本模式

61 子类继承模式

62 子类继承模式 子类继承模式缺点: 初学者接受困难 多写了很多代码,增加了出错的几率 类几乎翻番的增加,严重影响了编译速度和代码大小。

63 ui.h模式

64 8,向QPE中添加自己的程序 Qtopia是基于Qt的一个桌面程序,往其中安装应用程序需要一个桌面文件,图标文件以及相应的可执行文件。

65 8,向QPE中添加自己的程序 Qpe目录介绍 步骤

66 9, Qt/Embedded开发模型 嵌入式软件开发通常都采用交叉编译的方式进行,基于Qt/Embedded和Qtopia的GUI应用开发也采用这样的模式。先在宿主机上调试应用程序,调试通过后,经过交叉编译移植到目标板上。 Qt/Embedded直接写入帧缓存,在宿主机上则是通过qvfb(virtual framebuffer)来模拟帧缓存。qvfb是X窗口用来运行和测试Qtopia应用程序的系统程序。qvfb使用了共享内存存储区域(虚拟的帧缓存)来模拟帧缓存并且在一个窗口中模拟一个应用程序来显示帧缓存,显示的区域被周期性的改变和更新。

67 9, Qt/Embedded开发模型 交叉编译: export QTDIR=$PWD/qt
export QPEDIR=$PWD/qtopia export TMAKEDIR=$PWD/tmake export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++ export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/bin:$PATH cd qt make clean cp ../qtopia/src/qt/qconfig-qpe.h src/tools/ (echo yes ; echo no) | ./configure -platform linux-arm-g++ -qconfig qpe -depths 16,24,32 make -C src cd .. cd qtopia/src ./configure -platform linux-arm-g++ make

68 课堂回顾 形成对QTE开发的自己的理解。 如果编译中显示缺少uuid库怎么办? 编译时显示无法识别cos,sin等函数如何解决?
如果使用QT Designer设计界面后,用uic工具生成cpp文件时为空是怎么回事?


Download ppt "嵌入式用户图形界面编程 课程目的 了解嵌入式图形系统 掌握QT/E开发环境、关键技术 通过实例熟悉基于Qt/E的嵌入式GUI设计."

Similar presentations


Ads by Google