《实5手机QT界面编程初步.ppt》由会员分享,可在线阅读,更多相关《实5手机QT界面编程初步.ppt(49页珍藏版)》请在金锄头文库上搜索。
1、北京博创兴业科技有限公司Qt编程Qt简介LinuxGUIGTK+(C)Qt(C+)GNOMEGPEKDEOPIE/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
2、进行了专门的封装(文件处理,网络等)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站
3、点下载到这些工具包的源代码。Qt特征引入一种用于无缝对象通讯的被称为信号和槽的非常强大的机制可查询和可设计的属性,强大的事件和事件过滤器,根据上下文进行国际化的字符串翻译,完善的时间间隔驱动的计时器使得在一个事件驱动的图形界面程序中很好地集成许多任务成为可能。以一种自然的方式组织对象所有权的分层次和可查询的对象树。被守护的指针,QGuardedPtr,当参考对象被破坏时,可以自动地设置为无效,不像正常的C+指针在它们的对象被破坏的时候变成了“摇摆指针”。Qt编程核心技术Qt编程核心技术1.Qt对象模型u元对象系统u信号和槽u属性2.QObject类u对象树u事件处理元对象系统是一个C+扩展,使
4、得Qt更适合真正的组件GUI编程使用元编译器moc产生能被标准C+编译器访问的附加C+代码带有moc预编译器的C+基本上提供了面向对象的C的灵活性或类似于Java的运行环境,并保持了C+的执行效率和扩展性实现功能对象间通信的信号/槽机制运行时的类型信息动态属性系统信号和槽(1/2)所有的GUI程序必须有某种机制响应用户动作并执行处理代码。命令行程序的做法:暂停执行,等待用户输入,然后采用switch语句等机制使程序根据输入不同而分支执行。但GUI程序必须不断地响应用户输入,因为它还需要不断地更新窗口区域。现代窗口系统由事件和事件监听器系统来解决这个问题。其思想是:用户的每次动作都触发一个事件,
5、程序员只需要编写监听事件及事件触发时应该执行的代码。在GTK+中,使用信号和回调函数的机制。信号和槽(2/2)在Qt程序中,利用信号(signal)和槽(slot)机制进行对象间的通信当对象状态发生改变的时候,发出signal通知所有的slot接收signal,尽管它并不知道哪些函数定义了slot,而slot也同样不知道要接收怎样的signalsignal和slot机制真正实现了封装的概念,slot除了接收signal之外和其它的成员函数没有什么不同,而且signal和slot之间也不是一一对应的。事件驱动原理一个GUI可以由菜单、工具栏、按钮、输入框和其它许多统称为窗口组件的GUI元素组成。
6、当用户与窗口组件交互时,例如点击一个菜单项或者在输入框中输入文字,窗口部件将发出一个命名信号,例如clicked、text_changed。然后程序会对用户的动作做出响应,例如保存文档或退出应用程序。Qt通过把信号连接到称为槽的函数来实现这个机制。事件驱动的实现QApplication:exec()QApplication:enter_loop()QApplication:processNextEvent()QApplication:sendPostedEvents();QWSDisplay:getEvent()QApplication:qwsProcessEvent()QWSServer:p
7、rocessEventQueue()事件循环Signal和Slot的声明(1/2)Qt定义了两个伪关键字signals和slots来标识代码中类的信号和槽。下面是一个声明了信号和槽的类的例子。class Student : public QObject Q_OBJECT public: Student() myMark = 0; int mark() const return myMark; private slots: void setMark(int newMark); signals: void markChanged(int newMark); private: int myMark;
8、Signal和Slot的声明(2/2)常见的窗口组件通常已经在Qt库中实现了对用户的动作作出相应信号的发出的过程。如用户按下一个按钮后,命名为clicked的信号就会发出。当然我们也可以自定义信号,并在适当的时候发出这个信号。要发出一个信号,只需在代码的某处调用emit。如:void Student:setMark(int newMark) if (newMark!= myMark) myMark = newMark; emit markChanged(myMark); Signal和Slot的连接(1/2)在signal和slot声明以后,需要使用connect()函数将它们连接起来。con
9、nect()函数属于QObject类的成员函数,它能够连接signal和slot,也可以用来连接signal和signal,函数原形如下: bool QObject:connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) static 其中第一个和第三个参数分别指出signal和slot是属于那个对象或组件。Signal和Slot的连接(2/2)在使用connect()函数进行来接的时候,还需要用到SIGNAL()和SLOT()这两个宏,使用方法
10、如下:QLabel *label = new QLabel; QScrollBar *scroll = new QScrollBar;QObject:connect( scroll,SIGNAL(valueChanged(int), label, SLOT(setNum(int) );Signal和Slot的连接方式取消Signal和Slot连接取消Signal和Slot连接disconnect(lcd,SIGNAL(overflow(),this,SLOT(handleMathError();取消连接不是很常用,因为Qt会在一个对象被删除后自动取消这个对象所包含的所有的连接属性属性也是一个类
11、的成员在类声明中用宏Q_PROPERTY来声明只能在继承于QObject的子类中声明设置和得到属性的成员函数如下:QObject:setProperty()QMetaObject:propertyNames()QMetaObject:property()QObject类QObject是Qt类体系的唯一基类,是Qt各种功能的源头活水,就象MFC中的CObject和Dephi中的TObjectconnect():提供信号槽机制对象树:QObject在对象树中组织它们自己。当你以另外一个对象作为父对象来创建一个QObject时,它就被添加到父对象的children()列表中,并且当父对象被删除的时候
12、,它也会被删除。这种机制很好的适合了图形用户界面应用对象的需要。事件:事件是由窗口系统或qt本身对各种事务的反应而产生的。当用户按下、释放一个键或鼠标按钮,一个键盘或鼠标事件被产生;当窗口第一次显示,一个绘图事件产生,从而告知最新的可见窗口需要重绘自身。大多数事件是由于响应用户的动作而产生的,但还有一些,比如定时器等,是由系统独立产生的。QApplicationQApplication和QWidget都是QObject类的子类QApplication类负责GUI应用程序的控制流和主要的设置,它包括主事件循环体,负责处理和调度所有来自窗口系统和其他资源的事件,并且处理应用程序的开始、结束以及会话
13、管理,还包括系统和应用程序方面的设置。对于一个应用程序来说,建立此类的对象是必不可少的QWidgetQWidget类是所有用户接口对象的基类,它继承了QObject类的属性。组件是用户界面的单元组成部分,它接收鼠标、键盘和其它从窗口系统来的事件,并把它自己绘制在盘屏幕上QWidget类有很多成员函数,但一般不直接使用,而是通过子类继承来使用其函数功能。如,QPushButton、QlistBox等都是它的子类一个完整的Qt程序的例子1 #include 2 #include 3 int main(int argc, char *argv)4 5 QApplication app (argc,
14、argv);6 QLabel *hello = new QLabel(Hello Qt/Embedded!, 0);7 app.setMainWidget(hello);8 hello-show();9 return app.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操作系统
15、模拟目标板进行应用程序的开发。因为Qt-x11提供了一个虚拟帧缓冲qvfb (qt virtual frame buffer),可以用来模拟一个嵌入式目标板,开发的GUI应用程序就可以在qvfb上运行从而进行测试。在PC机上通过测试后,最后再把应用程序交叉编译,下载、运行在真正的目标设备上。建立X86平台PC机的Qt开发环境(二)解压缩并设置环境变量安装tmakecd /pxa270Qttar xzf tmake-1.13.tar.gzexport TMAKEDIR=$PWD/tmake-1.13安装Qt 2.3.2tar xzf qt-x11-2.3.2.tar.gzexport QT2DI
16、R=$PWD/qt-2.3.2安装Qt/E 2.3.10tar xzf qt-embedded-2.3.10-free.tar.gzexport QTEDIR=$PWD/qt-2.3.10建立X86平台PC机的Qt开发环境(三)编译Qt2.3.2cd $QT2DIRexport TMAKEPATH=$TMAKEDIR/lib/linux-g+export QTDIR=$QT2DIRexport PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHecho yes|./configure -no-xftma
17、kemkdir $QTEDIR/bincp bin/uic $QTEDIR/bin/建立X86平台PC机的Qt开发环境(四)编译qvfbexport TMAKEPATH=$TMAKEDIR/lib/linux-g+export QTDIR=$QT2DIRexport PATH=$QTDIR/bin:$TMAKEDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHcd $QTEDIR/tools/qvfbtmake -o Makefile qvfb.promakemv qvfb $QTEDIR/bin/建立X86平台PC机
18、的Qt开发环境(五)编译Qt/E 2.3.10cd $QTEDIRexport TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g+export QTDIR=$QTEDIRexport PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHcp $QPEDIR/./qconfig-qpe.h src/tools/./configure -no-xft -qvfb -depths 4,8,16,32 make建立X86平台PC机的Qt开发环境(六)在qvfb上显示Qt程序cd $Q
19、TEDIR/examples/launcherexport QTDIR=$QTEDIRexport PATH=$QTEDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTEDIR/lib:$QT2DIR/lib:$LD_LIBRARY_PATHqvfb -width 640 -height 480 &sleep 10./launcher -qws建立X86平台PC机的Qt开发环境(七)编译Qtopia2.1.1cd $QPEDIRexport QTDIR=$QTEDIRexport LD_LIBRARY_PATH=$QPEDIR/lib:$QTEDIR/lib:$LD
20、_LIBRARY_PATHexport PATH=$QPEDIR/bin:$PATH./configure -edition pda -no-qtopiadesktop -displaysize 640x480makemake install建立X86平台PC机的Qt开发环境(八)在qvfb上显示Qtopia桌面编辑qtopia.sh并保存在$QPEDIR/img/opt/Qtopia目录下,运行即可#!/bin/shexport QTDIR=$PWDexport QPEDIR=$QTDIRexport KDEDIR=$QTDIRexport TSLIB_TSDEVICE=/dev/input
21、/event1export LD_LIBRARY_PATH=$QPEDIR/libexport QWS_SIZE=640x480export QWS_MOUSE_PROTO=TPanel:/dev/input/event2 USBexport PATH=$PATH:$QPEDIR/bin qvfb -width 640 -height 480 -depth 16 -nocursor&sleep 5qpe为ARM平台建立Qt开发环境(一)上次实验我们在PC机上建立了Qt/E+Qtopia的模拟环境,而我们的Qtopia桌面和应用程序最终还是要在ARM开发板上运行的,所以这次我们要先建立Qt的交叉
22、开发环境,再交叉编译和运行Qt/Qtopia应用程序为ARM平台建立Qt开发环境(二)在Trolltech公司的网站上可以下载Qt/Embedded、Qtopia的免费版本, 所需源码包如下: e2fsprogs-libs-1.37.tar.gz ext2文件系统工具包 libjpeg-iwmmxt.tar.bz2jpeg解码库jpeg-6b tslib.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/X
23、11-3.3.4,需要使用其中的工具 qt-2.3.10. tar.gzQt/Embedded 2.3.10 qtopia-free-2.1.1. tar.bz2Qtopia 2.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
24、(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下载等方式在开发板上运行了。QtDesignerQtDesignerQt应用程序除了使用手工编写代码的方式外,图形界面的
25、设计一般可以用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
26、窗体的不同风格预览Qt程序开发流程QtDesigner设计流程图Qt程序开发过程1.使用designer设计u设计界面,添加窗口组件u建立信号槽连接u编写事件处理函数u保存工程为.ui文件,得到一个主窗口类2.编写main.cpp文件进行主窗口类的实例化及显示3.使用progen生成.pro工程文件progen t app.t o application.proQt程序开发过程4.设置编译所需的环境变量,包括指定tmake路径PC本机编译TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g+ARM交叉编译TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g+ 5.通过tmake自动生成Makefile文件tmake o Makefile application.pro6.make生成可执行文件谢谢各位