




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北京博创兴业科技有限公司,Qt编程,Qt简介,LinuxGUI,GTK+(C),Qt(C+),GNOME,GPE,KDE,OPIE/Qtopia,主流的Linux窗口系统,PC,嵌入式,Qt概述,Qt是Trolltech公司的标志性产品,是一个跨平台的C+图形用户界面(GUI)工具包Qt应用程序接口与工具兼容于所有支持平台,让开发员们掌握一个应用程序接口,便可执行与平台非相关的应用开发与配置Qt/Windows(WindowsXP,2000,NT4,Me/98)Qt/Mac(MacOSX)Qt/X11(Linux,Solaris,HP-UX,IRIX,AIX等)Qt/Embeded(嵌入式平台)Qt对不同平台的专门API进行了专门的封装(文件处理,网络等)Qt免费版本基于GPL协议,意味着我们可以用Qt库编写程序,并且免费发布自己的GPL软件。,Qt/Embedded及Qtopia介绍,Qt/Embedded(Qt/E)是Qt面向嵌入式应用的简化版本,大部分Qt的应用程序可以经过简单的编译与重设窗口大小移植到Qt/E。Qtopia是基于Qt/E库开发的一个嵌入式窗口系统和应用程序集,广泛用于PDA等掌上设备。整个GUI系统的构建需要对Qt/E、Qtopia依次分别编译,然后有机地整合在一起。Qt/E为Qtopia提供了底层支持,GUI系统的图形库窗口组建都由Qt/E实现。我们可以在Trolltech公司的ftp站点下载到这些工具包的源代码。,Qt特征,引入一种用于无缝对象通讯的被称为信号和槽的非常强大的机制可查询和可设计的属性,强大的事件和事件过滤器,根据上下文进行国际化的字符串翻译,完善的时间间隔驱动的计时器使得在一个事件驱动的图形界面程序中很好地集成许多任务成为可能。以一种自然的方式组织对象所有权的分层次和可查询的对象树。被守护的指针,QGuardedPtr,当参考对象被破坏时,可以自动地设置为无效,不像正常的C+指针在它们的对象被破坏的时候变成了“摇摆指针”。,Qt编程核心技术,Qt编程核心技术,Qt对象模型元对象系统信号和槽属性QObject类对象树事件处理,元对象系统,是一个C+扩展,使得Qt更适合真正的组件GUI编程使用元编译器moc产生能被标准C+编译器访问的附加C+代码带有moc预编译器的C+基本上提供了面向对象的C的灵活性或类似于Java的运行环境,并保持了C+的执行效率和扩展性实现功能对象间通信的信号/槽机制运行时的类型信息动态属性系统,信号和槽(1/2),所有的GUI程序必须有某种机制响应用户动作并执行处理代码。命令行程序的做法:暂停执行,等待用户输入,然后采用switch语句等机制使程序根据输入不同而分支执行。但GUI程序必须不断地响应用户输入,因为它还需要不断地更新窗口区域。现代窗口系统由事件和事件监听器系统来解决这个问题。其思想是:用户的每次动作都触发一个事件,程序员只需要编写监听事件及事件触发时应该执行的代码。在GTK+中,使用信号和回调函数的机制。,信号和槽(2/2),在Qt程序中,利用信号(signal)和槽(slot)机制进行对象间的通信当对象状态发生改变的时候,发出signal通知所有的slot接收signal,尽管它并不知道哪些函数定义了slot,而slot也同样不知道要接收怎样的signalsignal和slot机制真正实现了封装的概念,slot除了接收signal之外和其它的成员函数没有什么不同,而且signal和slot之间也不是一一对应的。,事件驱动原理,一个GUI可以由菜单、工具栏、按钮、输入框和其它许多统称为窗口组件的GUI元素组成。当用户与窗口组件交互时,例如点击一个菜单项或者在输入框中输入文字,窗口部件将发出一个命名信号,例如clicked、text_changed。然后程序会对用户的动作做出响应,例如保存文档或退出应用程序。Qt通过把信号连接到称为槽的函数来实现这个机制。,事件驱动的实现,事件循环,Signal和Slot的声明(1/2),Qt定义了两个伪关键字signals和slots来标识代码中类的信号和槽。下面是一个声明了信号和槽的类的例子。classStudent:publicQObjectQ_OBJECTpublic:Student()myMark=0;intmark()constreturnmyMark;privateslots:voidsetMark(intnewMark);signals:voidmarkChanged(intnewMark);private:intmyMark;,Signal和Slot的声明(2/2),常见的窗口组件通常已经在Qt库中实现了对用户的动作作出相应信号的发出的过程。如用户按下一个按钮后,命名为clicked的信号就会发出。当然我们也可以自定义信号,并在适当的时候发出这个信号。要发出一个信号,只需在代码的某处调用emit。如:voidStudent:setMark(intnewMark)if(newMark!=myMark)myMark=newMark;emitmarkChanged(myMark);,Signal和Slot的连接(1/2),在signal和slot声明以后,需要使用connect()函数将它们连接起来。connect()函数属于QObject类的成员函数,它能够连接signal和slot,也可以用来连接signal和signal,函数原形如下:boolQObject:connect(constQObject*sender,constchar*signal,constQObject*receiver,constchar*member)static其中第一个和第三个参数分别指出signal和slot是属于那个对象或组件。,Signal和Slot的连接(2/2),在使用connect()函数进行来接的时候,还需要用到SIGNAL()和SLOT()这两个宏,使用方法如下:QLabel*label=newQLabel;QScrollBar*scroll=newQScrollBar;QObject:connect(scroll,SIGNAL(valueChanged(int),label,SLOT(setNum(int);,Signal和Slot的连接方式,取消Signal和Slot连接,取消Signal和Slot连接disconnect(lcd,SIGNAL(overflow(),this,SLOT(handleMathError();取消连接不是很常用,因为Qt会在一个对象被删除后自动取消这个对象所包含的所有的连接,属性,属性也是一个类的成员在类声明中用宏Q_PROPERTY来声明只能在继承于QObject的子类中声明设置和得到属性的成员函数如下:QObject:setProperty()QMetaObject:propertyNames()QMetaObject:property(),QObject类,QObject是Qt类体系的唯一基类,是Qt各种功能的源头活水,就象MFC中的CObject和Dephi中的TObjectconnect():提供信号槽机制对象树:QObject在对象树中组织它们自己。当你以另外一个对象作为父对象来创建一个QObject时,它就被添加到父对象的children()列表中,并且当父对象被删除的时候,它也会被删除。这种机制很好的适合了图形用户界面应用对象的需要。事件:事件是由窗口系统或qt本身对各种事务的反应而产生的。当用户按下、释放一个键或鼠标按钮,一个键盘或鼠标事件被产生;当窗口第一次显示,一个绘图事件产生,从而告知最新的可见窗口需要重绘自身。大多数事件是由于响应用户的动作而产生的,但还有一些,比如定时器等,是由系统独立产生的。,QApplication,QApplication和QWidget都是QObject类的子类QApplication类负责GUI应用程序的控制流和主要的设置,它包括主事件循环体,负责处理和调度所有来自窗口系统和其他资源的事件,并且处理应用程序的开始、结束以及会话管理,还包括系统和应用程序方面的设置。对于一个应用程序来说,建立此类的对象是必不可少的,QWidget,QWidget类是所有用户接口对象的基类,它继承了QObject类的属性。组件是用户界面的单元组成部分,它接收鼠标、键盘和其它从窗口系统来的事件,并把它自己绘制在盘屏幕上QWidget类有很多成员函数,但一般不直接使用,而是通过子类继承来使用其函数功能。如,QPushButton、QlistBox等都是它的子类,一个完整的Qt程序的例子,1#include2#include3intmain(intargc,char*argv)45QApplicationapp(argc,argv);6QLabel*hello=newQLabel(HelloQt/Embedded!,0);7app.setMainWidget(hello);8hello-show();9returnapp.exec();10,Qt开发环境的建立,建立X86平台PC机的Qt开发环境(一),我们在这里移植了qt-embedded-2.3.10和免费PDA版本的qtopia-free-2.1.1图形界面。Qtopia的版本要和Qt/embedded的版本兼容,否则在编译链接的时候会出现错误。为了调试方便,在PC机上编译x86版本的Qt/E及Qtopia,在PC机的linux操作系统模拟目标板进行应用程序的开发。因为Qt-x11提供了一个虚拟帧缓冲qvfb(qtvirtualframebuffer),可以用来模拟一个嵌入式目标板,开发的GUI应用程序就可以在qvfb上运行从而进行测试。在PC机上通过测试后,最后再把应用程序交叉编译,下载、运行在真正的目标设备上。,建立X86平台PC机的Qt开发环境(二),解压缩并设置环境变量安装tmakecd/pxa270Qttarxzftmake-1.13.tar.gzexportTMAKEDIR=$PWD/tmake-1.13安装Qt2.3.2tarxzfqt-x11-2.3.2.tar.gzexportQT2DIR=$PWD/qt-2.3.2安装Qt/E2.3.10tarxzfqt-embedded-2.3.10-free.tar.gzexportQTEDIR=$PWD/qt-2.3.10,建立X86平台PC机的Qt开发环境(三),编译Qt2.3.2cd$QT2DIRexportTMAKEPATH=$TMAKEDIR/lib/linux-g+exportQTDIR=$QT2DIRexportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHechoyes|./configure-no-xftmakemkdir$QTEDIR/bincpbin/uic$QTEDIR/bin/,建立X86平台PC机的Qt开发环境(四),编译qvfbexportTMAKEPATH=$TMAKEDIR/lib/linux-g+exportQTDIR=$QT2DIRexportPATH=$QTDIR/bin:$TMAKEDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHcd$QTEDIR/tools/qvfbtmake-oMmakemvqvfb$QTEDIR/bin/,建立X86平台PC机的Qt开发环境(五),编译Qt/E2.3.10cd$QTEDIRexportTMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g+exportQTDIR=$QTEDIRexportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHcp$QPEDIR/./qconfig-qpe.hsrc/tools/./configure-no-xft-qvfb-depths4,8,16,32make,建立X86平台PC机的Qt开发环境(六),在qvfb上显示Qt程序cd$QTEDIR/examples/launcherexportQTDIR=$QTEDIRexportPATH=$QTEDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTEDIR/lib:$QT2DIR/lib:$LD_LIBRARY_PATHqvfb-width640-height480&sleep10./launcher-qws,建立X86平台PC机的Qt开发环境(七),编译Qtopia2.1.1cd$QPEDIRexportQTDIR=$QTEDIRexportLD_LIBRARY_PATH=$QPEDIR/lib:$QTEDIR/lib:$LD_LIBRARY_PATHexportPATH=$QPEDIR/bin:$PATH./configure-editionpda-no-qtopiadesktop-displaysize640 x480makemakeinstall,建立X86平台PC机的Qt开发环境(八),在qvfb上显示Qtopia桌面编辑qtopia.sh并保存在$QPEDIR/img/opt/Qtopia目录下,运行即可#!/bin/shexportQTDIR=$PWDexportQPEDIR=$QTDIRexportKDEDIR=$QTDIRexportTSLIB_TSDEVICE=/dev/input/event1exportLD_LIBRARY_PATH=$QPEDIR/libexportQWS_SIZE=640 x480exportQWS_MOUSE_PROTO=TPanel:/dev/input/event2USBexportPATH=$PATH:$QPEDIR/binqvfb-width640-height480-depth16-nocursor&sleep5qpe,为ARM平台建立Qt开发环境(一),上次实验我们在PC机上建立了Qt/E+Qtopia的模拟环境,而我们的Qtopia桌面和应用程序最终还是要在ARM开发板上运行的,所以这次我们要先建立Qt的交叉开发环境,再交叉编译和运行Qt/Qtopia应用程序,为ARM平台建立Qt开发环境(二),在Trolltech公司的网站上可以下载Qt/Embedded、Qtopia的免费版本,所需源码包如下:e2fsprogs-libs-1.37.tar.gzext2文件系统工具包libjpeg-iwmmxt.tar.bz2jpeg解码库jpeg-6btslib.tar.gz触摸屏工具包tmake-1.13.tar.gztmake工具,编译Qtopia需要使用qt-2.3.2.tar.gzQt/X11-2.3.2,需要使用其中的工具qt-x11-free-3.3.4.tar.bz2Qt/X11-3.3.4,需要使用其中的工具qt-2.3.10.tar.gzQt/Embedded2.3.10qtopia-free-2.1.1.tar.bz2Qtopia2.1.1,为ARM平台建立Qt开发环境(三),与PC机的X86平台安装Qt/E+Qtopia开发环境类似,不同的地方是这里还使用了几个另外的库,按照下面的顺序编译注意:可参考qtopia-free-2.1.1自带的文档中的BuildingQtopiafromSource一章。(1)解压缩源码包(2)设置环境变量(3)编译jpeg-6b库(4)编译e2fsprogs-libs库(5)编译tslib库(6)编译Qt2.3.2(7)编译Qt/Embedded(8)编译Qtopia,为ARM平台建立Qt开发环境(四),在本次实验中,脚本文件buildqtopia.sh已为大家做好了以上几步,我们可以将它复制到源代码目录,直接运行该文件进行编译。大家可以分析buildqtopia.sh内容,掌握编译的步骤。执行完buildqtopia.sh后,编译好的Qtopia位于qtopia-free-2.1.1/img/opt/Qtopia目录下根据开发板的配置建立Qtopia启动脚本下面可以通过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度沙发厂厂长聘用合同范本
- 2025版公路运输合同服务质量保障协议
- 2025版外汇市场交易执行顾问服务合同专业
- 2025年度房地产抵押权转让合同模板
- 2025照明灯具行业合作研发合同范本
- 2025版全新协议离婚财产放弃及共同子女财产租赁合同
- 2025年仓储服务与仓储设施租赁及仓储管理合同
- 2025民法典宣传周·旅游合同法律风险评估合同
- 2025年度新能源产业第三方担保服务合同
- 2025年大学生实习安全协议汇编及法律风险提示
- 第四节道亨slw2d架空送电线路评断面处理及定位设计系统部分操作说明
- 测振仪使用方法
- 2023-2024学年湖南省耒阳市小学语文六年级下册期末自测测试题
- 12YJ4-1 常用门窗标准图集
- 表- 邻二氯苯的理化性质和危险特性表
- 工程项目全过程造价管理课件PPT超详细
- 成人手术后疼痛处理专家共识
- 读书分享-《教育的情调》
- 《材料力学》说课-课件
- 物资采购付款报销单
- 政务云收费标准 云托管收费标准
评论
0/150
提交评论