实5手机QT界面编程初步.ppt

上传人:tian****1990 文档编号:12853337 上传时间:2020-05-31 格式:PPT 页数:49 大小:580.50KB
返回 下载 相关 举报
实5手机QT界面编程初步.ppt_第1页
第1页 / 共49页
实5手机QT界面编程初步.ppt_第2页
第2页 / 共49页
实5手机QT界面编程初步.ppt_第3页
第3页 / 共49页
点击查看更多>>
资源描述
北京博创兴业科技有限公司,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-oMakefileqvfb.promakemvqvfb$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启动脚本下面可以通过NFS或TFTP下载等方式在开发板上运行了。,QtDesigner,QtDesigner,Qt应用程序除了使用手工编写代码的方式外,图形界面的设计一般可以用QtDesinger来完成QtDesigner的功能十分强大,界面类似于VB、Delphi等可视化编程工具,提供了大量可供编程使用的组件,基于QtDesigner程序设计(1/4),在QtDesigner中开发时,一般要涉及到下面几个步骤:1.创建和初始化子部件2.设置子部件布局3.设置Tab键次序(不是必须)4.建立信号与插槽的连接5.编写事件处理函数,基于QtDesigner程序设计(2/4),1.创建并布置部件,2.对部件使用布局管理,3.建立信号与插槽的连接,基于QtDesigner程序设计(3/4),编辑两个部件之间信号与插槽之间的连接方式,基于QtDesigner程序设计(4/4),Qt窗体的不同风格预览,Qt程序开发流程,QtDesigner设计流程图,Qt程序开发过程,使用designer设计设计界面,添加窗口组件建立信号槽连接编写事件处理函数保存工程为.ui文件,得到一个主窗口类2.编写main.cpp文件进行主窗口类的实例化及显示3.使用progen生成.pro工程文件progentapp.toapplication.pro,Qt程序开发过程,4.设置编译所需的环境变量,包括指定tmake路径PC本机编译TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g+ARM交叉编译TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g+5.通过tmake自动生成Makefile文件tmakeoMakefileapplication.pro6.make生成可执行文件,谢谢各位,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!