《16_QT编程.ppt》由会员分享,可在线阅读,更多相关《16_QT编程.ppt(57页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 2008 博创科技北北 京京 博博 创 兴 业 科科 技技 有有 限限 公公 司司BEIJNG UNIVERSAL PIONEERING TECHNOLOGY Co.,LTD博创科技 嵌入互动QT编程嵌入式事业部:唐冬冬tdd_ 博创科技博创科技 嵌入互动嵌入互动嵌入式GUI简介GTK(C)QT(C+)GNOMEGPEKDEOPIE/Qtopia主流的Linux窗口系统PC嵌入式博创科技博创科技 嵌入互动嵌入互动嵌入式GUI系统uMicroWindowsuMiniGuiuTinyXuQt/Embedded博创科技博创科技 嵌入互动嵌入互动MicrowindowsMirowindows是嵌入式
2、系统中广为使用的一种图形用户接口,其官方网站是:http:/www.microwindows.org。这个项目的早期目标是在嵌入式Linux平台上提供和普通个人电脑上类似的图形用户界面。作为PC上X-Windows的替代品,Microwindows提供了和X-Windows类似的功能,但是占用的内存要少得多,根据用户得配置,Microwindows占用得内存资源在100KB-60KB。博创科技博创科技 嵌入互动嵌入互动MicrowindowsMicrowindows的核心基于显示设备接口,因此可移植行很好,microwindows有自己的Framebuffer,因此它并不局限于Linux开发平
3、台,在eCos、FreeBSD、RTEMS等操作系统上都能很好地运行。此外,Microwindows能在宿主机上仿真目标机。这意味着基于Linux的Microwindows应用程序的开发和调试可以在普通的个人电脑上进行,而不需要使用普通嵌入式软件的“宿主机目标机”调试模式,从而大大加快了开发速度。Mincrowindows是完全免费的一个用户图形系统。博创科技博创科技 嵌入互动嵌入互动MiniGUIMiniGUI是由北京飞漫软件技术有限公司主持的一个自由软件项目(遵循GPL条款),其目标是为基于实时嵌入式系统提供一个轻量级的图形用户界面支持系统。MiniGUI为应用程序定义了一组轻量级的窗口和
4、图形设备接口。利用这些接口,每个应用程序可以建立多个窗口,而且可以在这些窗口中绘制图形。用户也可以利用MiniGUI建立菜单、按钮、列表框等常见的GUI元素。博创科技博创科技 嵌入互动嵌入互动TinyXTinyX是一个针对嵌入式系统设计的XWindows,相对PC版的XWindows而言,它占用的资源少很多所有能够在标准X下运行的都能运行在TinyX上从字符界面到启动TinyX只需要2秒左右的时间不需要libc,兼容任何linux版本http:/www.xfree86.org博创科技博创科技 嵌入互动嵌入互动Qt/EmbeddedQt是KDE等项目使用的GUI支持库Qt/Embedded是面向
5、嵌入式系统的Qt版本许多基于XWindws程序可以非常方便地移植到Qt/Embedded版本上QtopiaandQt/EmbeddedQtopia是一个用于PDA,掌上电脑和网络应用产品的移动设备窗口环境和应用套件,它基于Qt/Embedded,包括PIM应用程序,Internet客户端,娱乐和游戏程序,Qtopia/PDA可以使用商业版权或开源协议,但QtoiaPhoneEdition只能用于商业博创科技博创科技 嵌入互动嵌入互动嵌入式用户图形界面编程1.嵌入式图形系统简介2.基于Qt/Embedded的嵌入式GUI设计3.建立开发环境4.运行QT/E程序博创科技博创科技 嵌入互动嵌入互动Q
6、t概述Qt是Trolltech公司的标志性产品,是一个跨平台的C+图形用户界面(GUI)工具包Qt应用程序接口与工具兼容于所有支持平台,让开发员们掌握一个应用程序接口,便可执行与平台非相关的应用开发与配置Qt/Windows(WindowsXP,2000,NT4,Me/98)Qt/Mac(MacOSX)Qt/X11(Linux,Solaris,HP-UX,IRIX,AIX等)Qt对不同平台的专门API进行了专门的封装(文件处理,网络等)博创科技博创科技 嵌入互动嵌入互动Qt特征引入一种用于无缝对象通讯的被称为信号和槽的非常强大的机制可查询和可设计的属性,强大的事件和事件过滤器,根据上下文进行国
7、际化的字符串翻译,完善的时间间隔驱动的计时器使得在一个事件驱动的图形界面程序中很好地集成许多任务成为可能。以一种自然的方式组织对象所有权的分层次和可查询的对象树。被守护的指针,QGuardedPtr,当参考对象被破坏时,可以自动地设置为无效,不像正常的C+指针在它们的对象被破坏的时候变成了“摇摆指针”。博创科技博创科技 嵌入互动嵌入互动Qt编程核心技术编程核心技术1.QT对象模型u元对象系统u信号和插槽u属性2.QObject类u对象树u事件处理博创科技博创科技 嵌入互动嵌入互动元对象系统是一个C+扩展,使得QT更适合真正的组件GUI编程使用元编译器moc产生能被标准C+编译器访问的附加C+代
8、码带有moc预编译器的C+基本上提供了面向对象的灵活性,并保持了C+的执行效率和扩展性博创科技博创科技 嵌入互动嵌入互动信号和插槽在Qt程序中,利用信号(signal)和插槽(slot)机制进行对象间的通信事件处理的方式也是回调当对象状态发生改变的时候,发出signal通知所有的slot接收signal,尽管它并不知道哪些函数定义了slot,而slot也同样不知道要接收怎样的signalsignal和slot机制真正实现了封装的概念,slot除了接收signal之外和其它的成员函数没有什么不同,而且signal和slot之间也不是一一对应的。博创科技博创科技 嵌入互动嵌入互动Signal和Sl
9、ot的声明(1/2)在Qt程序设计中,凡是包含signal和slot的类中都要加上Q_OBJECT的定义class Student:public QObject Q_OBJECT public:Student()myMark=0;int mark()const return myMark;public slots:void setMark(int newMark);signals:void markChanged(int newMark);private:int myMark;博创科技博创科技 嵌入互动嵌入互动Signal和Slot的声明(2/2)signal的发出一般在事件的处理函数中,利用
10、emit发出signal,在下面的例子中在在事件处理结束后发出signalvoid Student:setMark(int newMark)if(newMark!=myMark)myMark=newMark;emit markChanged(myMark);博创科技博创科技 嵌入互动嵌入互动Signal和Slot的连接(1/2)在signal和slot声明以后,需要使用connect()函数将它们连接起来。connect()函数属于QObject类的成员函数,它能够连接signal和slot,也可以用来连接signal和signal,函数原形如下:bool QObject:connect(co
11、nst QObject*sender,const char*signal,const QObject*receiver,const char*member )static 其中第一个和第三个参数分别指出signal和slot是属于那个对象或组件博创科技博创科技 嵌入互动嵌入互动Signal和Slot的连接(2/2)在使用connect()函数进行来接的时候,还需要用到SIGNAL()和SLOT()这两个宏,使用方法如下:QLabel*label=new QLabel;QScrollBar*scroll=new QScrollBar;QObject:connect(scroll,SIGNAL(v
12、alueChanged(int),label,SLOT(setNum(int);博创科技博创科技 嵌入互动嵌入互动Signal和Slot的连接方式博创科技博创科技 嵌入互动嵌入互动取消Signal和Slot连接取消一个连接disconnect(lcd,SIGNAL(overflow(),this,SLOT(handleMathError();取消一个连接不是很常用,因为Qt会在一个对象被删除后自动取消这个对象所包含的所有的连接博创科技博创科技 嵌入互动嵌入互动属性属性也是一个类的成员在类声明中用宏Q_PROPERTY来声明只能在继承于QObject的子类中声明设置和得到属性的成员函数如下:QO
13、bject:setProperty()QMetaObject:propertyNames()QMetaObject:property()博创科技博创科技 嵌入互动嵌入互动QObject类QObject是Qt类体系的唯一基类,是Qt各种功能的源头活水,就象MFC中的CObject和Dephi中的TObject对象树:QObject在对象树中组织它们自己。当你以另外一个对象作为父对象来创建一个QObject时,它就被添加到父对象的children()列表中,并且当父对象被删除的时候,它也会被删除。这种机制很好的适合了图形用户界面应用对象的需要。事件:事件是由窗口系统或qt本身对各种事务的反应而产生
14、的。当用户按下、释放一个键或鼠标按钮,一个键盘或鼠标事件被产生;当窗口第一次显示,一个绘图事件产生,从而告知最新的可见窗口需要重绘自身。大多数事件是由于响应用户的动作而产生的,但还有一些,比如定时器等,是由系统独立产生的。博创科技博创科技 嵌入互动嵌入互动事件运行机制QApplication:exec()QApplication:enter_loop()QApplication:processNextEvent()QApplication:sendPostedEvents();QWSDisplay:getEvent()QApplication:qwsProcessEvent()QWSServe
15、r:processEventQueue()事件循环博创科技博创科技 嵌入互动嵌入互动QApplicationQApplication和QWidget都是QObject类的子类QApplication类负责GUI应用程序的控制流和主要的设置,它包括主事件循环体,负责处理和调度所有来自窗口系统和其他资源的事件,并且处理应用程序的开始、结束以及会话管理,还包括系统和应用程序方面的设置。对于一个应用程序来说,建立此类的对象是必不可少的博创科技博创科技 嵌入互动嵌入互动QWidgetQWidget类是所有用户接口对象的基类,它继承了QObject类的属性。组件是用户界面的单元组成部分,它接收鼠标、键盘和
16、其它从窗口系统来的事件,并把它自己绘制在盘屏幕上QWidget类有很多成员函数,但一般不直接使用,而是通过子类继承来使用其函数功能。如,QPushButton、QlistBox等都是它的子类博创科技博创科技 嵌入互动嵌入互动一个完整的Qt程序1#include 2#include 3 int main(int argc,char*argv)4 5 QApplication app(argc,argv);6 QLabel*label=new QLabel(Hello Qt!);7 label-show();8 return app.exec();9 博创科技博创科技 嵌入互动嵌入互动QtDesi
17、gner博创科技博创科技 嵌入互动嵌入互动QtDesigner直接使用代码来直接编写GUI无疑是非常痛苦的,好在QT提供了界面开发工具:QTdesignerQt应用程序除了使用手工编写代码的方式外,还可以用过QtDesinger来完成QtDesigner的功能十分强大,界面类似于VB,而且还提供了大量可供编程使用的组件博创科技博创科技 嵌入互动嵌入互动博创科技博创科技 嵌入互动嵌入互动基于QtDesigner程序设计(1/4)在使用QtDesigner程序开发时,一般要涉及到下面几个步骤:1.创建和初始化子部件2.设置子部件布局3.设置Tab键次序(不是必须)4.建立信号与插槽的连接5.编写事
18、件处理函数博创科技博创科技 嵌入互动嵌入互动基于QtDesigner程序设计(2/4)1.创建并布置部件2.对部件使用布局管理3.建立信号与插槽的连接博创科技博创科技 嵌入互动嵌入互动基于QtDesigner程序设计(3/4)编辑两个部件之间信号与插槽之间的连接方式博创科技博创科技 嵌入互动嵌入互动基于QtDesigner程序设计(4/4)QtDesigner下不同风格的预览博创科技博创科技 嵌入互动嵌入互动QtDesigner的工作过程QtDesigner将工程文件组织成.ui的文件由.ui文件生成.h文件.ui-xmlUIC-oform.hform.ui需要注意的是,在QT3中使用例如UI
19、C-oform.cpp-iform.hform.ui这样的方式来生成表单的CPP文件,但在QT4中,UIC已经作了修改,不能输出表单的CPP文件由C+编译器编译所有.h和.cpp文件博创科技博创科技 嵌入互动嵌入互动QtDesigner功能框图博创科技博创科技 嵌入互动嵌入互动Qt程序开发流程博创科技博创科技 嵌入互动嵌入互动Qt程序开发过程1.使用designeru设计界面,添加窗口组件u建立信号槽连接u编写事件处理函数u保存工程为.ui文件,得到一个主窗口类2.编写main.cpp文件进行主窗口类的实例化及显示3.设置编译所需的环境变量QTDIR=博创科技博创科技 嵌入互动嵌入互动Qt程序
20、开发过程4.使用qmake生成.pro工程文件rootIntelqt4qmake-project5.通过qmake自动生成Makefile文件rootIntelqt4qmake6.make生成可执行文件7.运行博创科技博创科技 嵌入互动嵌入互动Qt/EmbeddedQt/Embedded(简称QtE)是一个专门为嵌入式系统设计图形用户界面的工具包。Qt是挪威Trolltech软件公司的产品,它为各种系统提供图形用户界面的工具包,QtE就是Qt的嵌入式版本。博创科技博创科技 嵌入互动嵌入互动Qt/Embedded使用QtE,开发者可以:用QtE开发的应用程序要移植到不同平台时,只需要重新编译代码
21、,而不需要对代码进行修改。可以随意设置程序界面的外观。可以方便地为程序连接数据库。可以使程序本地化。可以将程序与Java集成。博创科技博创科技 嵌入互动嵌入互动嵌入式系统地要求是小而快速,而QtE就能帮助开发者为满足这些要求开发强壮地应用程序。QtE是模块化和可裁剪地。开发者可以选取他所需要的一些特性,而裁剪掉所不需要的。这样,通过选择所需要的特性,QtE的映像变得很小,最小只有600K左右。博创科技博创科技 嵌入互动嵌入互动同Qt一样,QtE也是用C+写的,虽然这样会增加系统资源消耗,但是却为开发者提供了清洗的程序框架,使开发者能够迅速上手,并且能够方便地编写自定义的用户界面程序。由于QtE
22、是作为一种产品推出,所以它有很好的开发团体和技术支持,这对于使用QtE的开发者来说,方便开发过程,并增加了产品的可靠性。博创科技博创科技 嵌入互动嵌入互动总的来说,QtE拥有下面一些特征:拥有同Qt一样的API;开发者只需要了解Qt的API,不用关心程序所用到的系统与平台它的结构很好地优化了内存和资源地利用。拥有自己的窗口系统:QtE不需要一些子图形系统。它可以直接对底层的图形驱动进行操作。模块化:开发者可以根据需要自己定制所需要的模块。代码公开以及拥有十分详细的技术文档帮助开发者。强大的开发工具。博创科技博创科技 嵌入互动嵌入互动与硬件平台无关:QtE可以应用在所有主流平台和CPU上。支持所
23、有主流的嵌入式Linux,对于在Linux上的QtE的基本要求只不过是FrameBuffer设备和一个C+编译器(如gcc)。Qte同时也支持很多实时的嵌入式系统,如QNX和WindowsCE。提供压缩字体格式:即使在很小的内存中,也可以提供一流的字体支持。支持多种的硬件和软件的输入。支持Unicode,可以轻松地使程序支持多种语言。支持反锯齿文本和Alpha混合的图片。博创科技博创科技 嵌入互动嵌入互动QtE虽然公开代码和技术文档,但是它不是免费的,当开发者的商业化产品需要用到他的运行库时,必须向Trolltech公司支持license费用(每套3美金),如果开发的东西不用于商业用途则不需要
24、付费。QtE由于平台无关性和提供了很好的Gui编程接口,在许多嵌入式系统中得到了广泛的应用,是一个成功的嵌入式GUI产品。博创科技博创科技 嵌入互动嵌入互动QTE和QT/X11开发模型QTE与QT/X11比较Linux KernelFramebufferQT/EmbeddedQT/X11XlibX Window ServerQT APIApplication Source Code博创科技博创科技 嵌入互动嵌入互动QTE与QT/X11比较QT/Embedded通过QtAPI与LinuxI/O设施直接交互,成为嵌入式linux端口。同Qt/X11相比,QT/Embedded很节省内存,其不需要一
25、个X服务器或是Xlib库,它在底层摈弃了Xlib,采用framebuffer(帧缓存)作为底层图形接口。同时,将外部输入设备抽象为keyboard和mouse输入事件。QT/Embedded的应用程序可以直接写内核缓冲帧,这可避免开发者使用繁琐的Xlib/Server系统。博创科技博创科技 嵌入互动嵌入互动QtopiaTrolltech公司在QtE的基础上开发了一个应用的环境Qtopia,这个应用环境为移动和手持设备开发。其特点就是拥有完全的、美观的GUI,同时它也提供可上百个应用程序用于管理用户信息、办公、娱乐、Internet交流等。已经有很多公司采用了Qtopia来开发他们主流的PDA。
26、博创科技博创科技 嵌入互动嵌入互动Qtopia是一种全方位的应用开发平台,它可用于基于嵌入式linux的PDA,移动电话,webpads,以及其他移动计算设备。Qtopia构建于Qt/Embedded之上,是专为基于linux的消费电子产品提供和创建图形用户界面而设计的。常见的有两种版本:1.QtopiaPhone版:专为基于linux的智能电话和多功能电话设计。2.QtopiaPDA版:专为基于linux的PDA设计。博创科技博创科技 嵌入互动嵌入互动QTE/Qtoia博创科技博创科技 嵌入互动嵌入互动Qtopia特色:视窗操作系统;同步窗口;开发环境;本地化支持;游戏和多媒体;PIM应用程
27、序;输入法;个性化选项;internet应用程序;java集成;无线支持;博创科技博创科技 嵌入互动嵌入互动Qt/Embedded开发模型嵌入式软件开发通常都采用交叉编译的方式进行,基于Qt/Embedded和Qtopia的GUI应用开发也采用这样的模式。先在宿主机上调试应用程序,调试通过后,经过交叉编译移植到目标板上。Qt/Embedded直接写入帧缓存,在宿主机上则是通过qvfb(virtualframebuffer)来模拟帧缓存。qvfb是X窗口用来运行和测试Qtopia应用程序的系统程序。qvfb使用了共享内存存储区域(虚拟的帧缓存)来模拟帧缓存并且在一个窗口中模拟一个应用程序来显示帧
28、缓存,显示的区域被周期性的改变和更新。博创科技博创科技 嵌入互动嵌入互动Qt/Embedded开发模型宿主机移植所需环境变量声明:exportQTDIR=/usr/lib/qt4exportQTINC=/usr/lib/qt4/includeexportQTLIB=/usr/lib/qt4/libexportPATH=$QTDIR/bin:$PATH博创科技博创科技 嵌入互动嵌入互动基于基于Qt/Embedded的嵌入式的嵌入式GUI设计设计建立Qt/Embedded开发环境1、安装QT for X11源代码#tar xvzf qt-x11-opensource-src-4.4.0.tar.g
29、z#cd qt-x11-opensource-src-4.4.0#./build.sh2、安装QT/E源代码u#tar xvzf qtopia-core-opensource-src-4.3.3.tar.gzu#cdqtopia-core-opensource-src-4.3.3u#./build.sh(shell 程序程序)博创科技博创科技 嵌入互动嵌入互动设置链接库设置链接库当在PC上模拟QT/E的运行时,需要用到对应Qt版本的库文件设置LD_LIBRARY_PATH=/usr/local/qt4/lib博创科技博创科技 嵌入互动嵌入互动运行程序设置环境变量exportQTDIR=/usr/qpeexportQPEDIR=/usr/qpeexportKDEDIR=/usr/qpeexportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/qpe/lib/exportQWS_SIZE=640 x480exportQWS_MOUSE_PROTO=TPanel:/dev/input/event0USBexportLANG=zh_CN运行QT/E程序./helloword-qws博创科技博创科技 嵌入互动嵌入互动