嵌入式第八章课件_第1页
嵌入式第八章课件_第2页
嵌入式第八章课件_第3页
嵌入式第八章课件_第4页
嵌入式第八章课件_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章图形用户接口8.1嵌入式图形系统简介8.2QT8.1嵌入式图形系统简介8.1.1GUI的概念8.1.2Linux图形系统的发展史8.1.3嵌入式GUI8.1.4常用的几种嵌入式GUI8.1.1GUI的概念GUI(GraphicsUserInterface)图形用户接口,是计算机与用户之间的图形化对话接口,如电脑界面,手机界面,游戏机界面等。这些界面一般由两部分组成:一个是提供用户操作的界面的应用程序,如电脑的记事本,手机上的电话本,短消息等另一个管理系统里面所有的应用的窗口的交互,建立等,这个部分又被称为GUIFramework。GuiFramework提供给应用的接口主要包括窗口的建立,事件的注册,还会提供更加底层的接口让应用创建自己特色的窗口。Framework内部实现主要分为四部分:

1.图形引擎

2.事件系统

3.窗口系统

4.用户接口层图形引擎提供最底层的图形函数,如点、线、矩形、椭圆形、图片等,及最底层的图形区域的计算,颜色的计算等。事件系统提供对最原始的硬件源事件的管理,如鼠标的点击,键盘的输入,触摸屏的操作等,将这些事件发送到指定的模块,以及提供内部自定义的事件管理和转发。窗口系统实际上是对图形引擎和事件系统的封装,给本来屏幕上每一块的区域都添加了“生命”,使得这些区域可以响应事件,显示特定的图像。用户接口层主要是为应用程序服务的,让应用程序不关心图形引擎和事件系统的情况下来建立自己的窗口。8.1.2Linux图形系统的发展史Windows是一个图形操作系统,它的GUI和操作系统是在一起的,而Linux本身没有图形界面,linux下的图形界面是应用程序实现的,支持的标准是XWinodw。图形界面并不是linux的一部分,linux只是一个基于命令行的文本操作系统。linux和XWindow的关系就相当于当年的DOS和WINDOWS3.0一样,windows3.0不是独立的操作系统,它只是DOS的扩充,是DOS下的应用程序级别的系统,不是独立的操作系统,同样XWindows只是linux下的一个应用程序而已,不是系统的一部分。8.1.3嵌入式GUI早期嵌入式系统功能简单,对图形用户界面需求并不是太大。而且当时的图形系统对硬件要求太高,在嵌入式上实现几乎没有可能。软硬件技术的进步使得嵌入式系统下的图形开发成为可能,嵌入式GUI(嵌入式系统使用的GUI)使我们能更容易易地编写出更好、更漂亮的界面。嵌入式GUI具有一些与一般GUI不同的特点:占用的存储空间以及运行时占用资源少,这一点决定它和Windows不同,也和PC上运行的大型GUI不同运行速度及响应速度快,能适应嵌入式系统的实时性要求可靠性高,这和嵌入式的应用领域相关,比如军事、航天和工业控制领域。便于移植和定制,嵌入式系统本身就是一种个性化设备,对GUI的需求各不相同,所以它使用的GUI也必须是可定制的。8.1.4常用的几种嵌入式GUI一个简单的GUI—μcGUI嵌入式linux(支持XWindows)下的GUI:TinyXMicroWindowsOpenGUIMiniGUIQtTinyXTinyX,是标准X-Windows在嵌入式系统的小巧实现,作为一个图形环境,X-Windows是成功的,但由于在体系接口上的原因,限制了它对游戏、多媒体的支持能力。MicrowindowsMicrowindows是嵌入式系统中广为使用的一种图形用户接口,其官方网站是:。这个项目的早期目标是在嵌入式Linux平台上提供和普通个人电脑上类似的图形用户界面。其主要特色在于提供了C/S体系结构,同时也提供了相对完善的图形功能。但却无任何硬件加速能力,图形引擎中也存在着许多未经优化的低效算法。Microwindows的核心基于显示设备接口,因此可移植行很好,microwindows有自己的Framebuffer,因此它并不局限于Linux开发平台,在eCos、FreeBSD、RTEMS等操作系统上都能很好地运行。此外,Microwindows能在宿主机上仿真目标机。这意味着基于Linux的Microwindows应用程序的开发和调试可以在普通的个人电脑上进行,而不需要使用普通嵌入式软件的“宿主机-目标机”调试模式,从而大大加快了开发速度。Mincrowindows是完全免费的一个用户图形系统MiniGUIMiniGUI是由北京飞漫软件技术有限公司主持的一个自由软件项目(遵循GPL条款)。MiniGUI最初是为了满足一个工业控制系统(计算机数控系统)的需求而设计和开发的。这个工业控制系统是清华大学为一台数控机床设计的计算机数控系统(CNC)。该项目组选择RT-Linux作为实时操作系统,以便满足2ms甚至更高的实时性,是为解决图形用户界面问题开发一套图形用户界面支持系统。MiniGUI一开始就是针对实时系统设计的,在设计之初就考虑到了小巧、高性能和高效率。在考虑到其他不同于数控系统的嵌入式系统时,为了满足千变万化的需求,必须要求GUI系统是可配置的。在CNC系统中得到成功应用之后,立即着手于MiniGUI可配置的设计。通过Linux下的automake和autoconf接口,实现了大量的编译配置选项,通过这些选项可指定MiniGUI库中包括哪些功能而同时不包括哪些功能。因此,MiniGUI是一个非常适合于工业控制实时系统以及嵌入式系统的可定制的、小巧的图形用户界面支持系统。8.2QT8.2.1QT/E8.2.2QTOPIA8.2.3Qt编程特点8.2.4Signal和Slot8.2.5一个QT程序8.2.6QTE程序开发全过程QT/E特点QT是跨平台的,可支持的平台包括:MS/Windows95、Windows98、WindowsNT4.0、Windows2000、WindowsXP;Unix/X11Linux、SunSolaris、HP-UX、CompaqTrue64Unix、IBMAIX、SGIIRIX和很多其它X11平台;MacintoshiMacOSX;嵌入式的,包含有FramBuffer的Linux平台。功能可裁减:Qt/Embedded提供了大约200个可配置的特征资源丰富:trolltech的主页:./支持匿名访问的FTP:新闻组服务器:非官方的Qt文档中文翻译小组:工具丰富提供了构建(qmake)、可视化设计(uic和qdesigner)、国际化(linguist)、文档系统(assistant)等一系列非常好用的工具。尤其是文档系统,绝对可以称得上是出色。丰富的API函数:Qt/Embedded也可以看成是一组用于访问嵌入式设备的QtC++API;Qt/Embedded与Qt/X11,Qt/Windows和Qt/Mac版本一样,提供的都是相同的API和工具。运行需要资源少、功能强大:Qt/Embedded只要求一个较小的存储空间和内存。Qt/Embedded可以运行在不同的处理器上部署的Linux系统,只要这个系统有一个线性地址的缓冲帧并支持C++的编译器。QTE和Qtopia开发模型LinuxKernelFrame-bufferQT/EmbeddedQT/X11XlibXWindowServerQTAPIQTOPIAorOtherApplication8.2.3Qt编程特点初始化窗口的创建组件的创建事件退出事件程序整个Qt程序的执行过程在Qt程序中,创建窗口比较简单,只需在main.cpp文件中为ApplicationWindow建立一个指针: ApplicationWindow*mw=newApplicatonWindow();ApplicationWindow是在Application.h中定义的类,它是一个QmainWindow的继承类窗口的创建组件的创建需要调用相应组件的类,并在头文件中包含此类的头文件或者创建自定义类,继承相应组件类的功能 #include“qpushbutton.h” classhello::publicQwidget { …… }hello类继承了Qwidget类的特征,并加入了自定义的特征功能组件的创建在main.cpp的函数中需要创建hello类的实例,或创建QPushButton类的实例,才可以使用 helloh(string); QPushButtonhello(“Hello,world!”,0);如果组件本身为窗口(可以作为应用程序主窗口),则无需设置主组件。上例中下压按钮创建时其构造函数中的第二个参数为0,表示按钮所在窗口为主窗口。否则需要调用成员函数setMainWidget()来进行设置主组件:a.setMainWidget(&h);组件创建时一般是不可见的,这样的好处在于避免大量组件创建时造成的屏幕闪烁现象,要使组件可见需要调用QWidget类的成员函数show()来显示组件:h.show();事件在Windows程序中,敲击键盘,鼠标指针在窗口中的移动或鼠标按键动作等,都是事件在Windows中提供了提供了一种叫做回调的事件处理方式。它通过翻译表,将事件映射为相应的动作,当组件得到事件通知,就去表中找出相应的动作例程进行处理。这种机制需要应用程序注册有关组件的回调函数或普通的事件处理函数,以分发循环Windows的事件Qt事件的处理过程:QApplication的事件循环体从事件队列中拾取本地窗口系统事件或其他事件,译成QEvent(),并送给QObject::event(),最后送给QWidget::event()分别对事件处理在Qt程序中,事件处理的方式也是回调,但与以往所不同的是,事件的发出和接收采用了信号(signal)和插槽(slot)机制,无须调用翻译表。利用信号和插槽进行对象间的通信是Qt的最主要特征之一。当对象状态发生改变的时候,发出signal通知所有的slot接收signal,尽管它并不知道哪些函数定义了slot,而slot也同样不知道要接收怎样的signalsignal和slot机制真正实现了封装的概念,slot除了接收signal之外和其它的成员函数没有什么不同,而且signal和slot之间也不是一一对应退出事件程序退出事件程序,只需要在程序结束时返回一个exec(),例如: returna.exec();其中a为QApplication的实例,当调用exec()将进入主事件的循环中,直到exit()被调用或主窗口组件被销毁整个Qt程序的执行过程8.2.4Signal和SlotSignal和Slot的声明Signal和Slot的连接Signal和Slot的连接方式Signal和Slot的声明在Qt程序设计中,凡是包含signal和slot的类中都要加上Q_OBJECT的定义,下面的例子给出了如何在一个类中定义signal和slot: classStudent:publicQObject { Q_OBJECT public: Student(){myMark=0;} intmark()const{returnmyMark;}

publicslots: voidsetMark(intnewMark);

signals: voidmarkChanged(intnewMark); private: intmyMark; };signal的发出一般在事件的处理函数中,利用emit发出signal,在下面的例子中在在事件处理结束后发出signal voidStudent::setMark(intnewMark) { if(newMark!=myMark){ myMark=newMark;

emitmarkChanged(myMark); } }Signal和Slot的连接在signal和slot声明以后,需要使用connect()函数将它们连接起来。connect()函数属于QObject类的成员函数,它能够连接signal和slot,也可以用来连接signal和signal函数原形如下: boolQObject::connect ( constQObject*sender, //发送对象

constchar*signal, //信号 constQObject*receiver, //接收对象 constchar*member //槽 )在使用connect()函数进行来接的时候,还需要用到SIGNAL()和SLOT()这两个宏,使用方法如下: QLabel*label=newQLabel; QScrollBar*scroll=newQScrollBar; QObject::connect(scroll,SIGNAL(valueChanged(int)),label,SLOT(setNum(int)));Signal和Slot的连接方式同一个信号连接多个插槽 connect(slider,SIGNAL(valueChanged(int)),spinBox,SLOT(setValue(int))); connect(slider,SIGNAL(valueChanged(int)),this, SLOT(updateStatusBarIndicator(int)));多个信号连接到同一个插槽 connect(lcd,SIGNAL(overflow()),this,SLOT(handleMathError())); connect(calculator,SIGNAL(divisionByZero()),this, SLOT(handleMathError()));一个信号连接到另一个信号connect(lineEdit,SIGNAL(textChanged(constQString&)),this,SIGNAL(updateRecord(constQString&)));取消一个连接disconnect(lcd,SIGNAL(overflow()),this,SLOT(handleMathError()));取消一个连接不是很常用,因为Qt会在一个对象被删除后自动取消这个对象所包含的所有的连接下面通过编写一个“HelloEmbedded”程序来了解Qt。#include<qapplication.h>#include<qlabel.h>intmain(intargc,char**argv){ QApplicationapp(argc,argv); QLabel*hello=newQLabel("helloQt/Embedded!",0); app.setMainWidget(hello); hello->show(); returnapp.exec();}8.2.5一个QT程序程序第1行和第2行包含了两个头文件,这两个头文件中包含了QApplication和QLabel类的定义。第5行创建了一个QApplication对象,用于管理整个程序的资源,它需要2个参数,因为Qt本身需要一些命令行的参数。第6行创建了一个用来显示HelloQt/Embedded!的组件。在Qt中,组件是一个可视化用户接口,按钮、菜单、滚动条都是组件的实例。组件可以包含其它组件,例如,一个应用程序窗口通常是一个包含QMenuBar、QToolBar、QStatusBar和其它组件的一个部件。在QLabel函数中的参数0表示所在窗口为主窗口。第7行设置hello为程序的主组件,当用户关闭主组件后,应用程序将会被关闭。如果没有主组件的话,即使用户关闭了应用程序也会在后台继续运行。第8行使hello组件可视,一般来说组件被创建后都是被隐藏的,因此可以在显示前根据需要来订制组件,这样的好处是可以避免组件创建所造成的闪烁。第9行把程序的控制权交还给Qt,这时候程序进入就绪模式,可是随时被用户行为激活,例如点击鼠标、敲击键盘等。8.2.6QTE程序开发全过程以一个QT4为例,其它版本可能会有些不同第一步编译QT-X11环境编译QT/E编写QT-X11程序第一步PC机上安装linux安装ARMLinux工具链下载QT:qt-embedded-linux-opensource-src-4.4.0.tar.bz2tslib-1.4.tar.bz2qt-x11-opensource-src-4.4.0.tar.gzQT下载网站:编译QT-X11环境解压qt-x11-opensource-src-4.4.0.tar.gz在源码目录下执行:./configuregmakegmakeinstall1、编译tslib1.4触摸屏库:解压tslib-1.4.tar.bz2修改其中的bulild.sh,将编译工具链设置成基于arm-linux的执行./build.sh2、编译QT/E库:解压qt-embedded-linux-opensource-src-4.4.0.tar.bz2将上一步编译好的库文件和头文件拷贝到相关目录,并利用./configure配置好makemakeinst

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论