Qt编程培训ppt课件_第1页
Qt编程培训ppt课件_第2页
Qt编程培训ppt课件_第3页
Qt编程培训ppt课件_第4页
Qt编程培训ppt课件_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

1、讲义纲要,Qtopia集成开发环境搭建基础窗口部件Qwidget信号和槽事件处理,1,Qt概念,Qt是挪威Trolltech公司的旗舰产品,作为跨平台开发框架,是开源KDE桌面的基石.GoogleEarch,Skype,Opera,AdobePhotoshopElement等著名软件都是基于Qt编写的.目前Qt最新版本为4.3.4和java的”一次编写到处运行”所不同的是,Qt是源代码级的跨平台一次编写到处编译.一次开发的Qt应用程序可以移值到不同平台.目前Qt支持的平台有:Mac,WindowsNT/2000/XP/Vista,unix,linux,嵌入式linux,2,Qt和Qtopia之

2、间的关系,Qt泛指Qt的所有桌面版本,比如Qt/X11,QtWindows,QtMac等。由于Qt最早是在Linux中随着KDE流行开来的,因此通常很多人说的Qt都指用于Linux/Unix的Qt/X11。Qt/E(Qt/Embedded)是用于嵌入式Linux系统的Qt版本。Qt/E去掉了XLib的依赖而直接工作于FrameBuffer上,因而效率更高,但它并不是Qt的子集,而应该是超集,部分机制(如QCOP等)不能用于Qt/X11中。Qtopia是一个构建于Qt/E之上的类似桌面系统的应用环境。相比之下,Qt/E是基础类库。QtopiaCore:就是原来的Qt/E,大概从Qt4开始改名,把

3、QtopiaCore并到Qtopia的产品线中去了。但实际上QtopiaCore就相当于原来的Qt/E,仍然作为基础类库。,3,Qtopia安装,从网站上下载的qt文件qtopia-2.2.0.tar.gz,拷贝到一个单独目录中.推荐放在opt目录下单独解压tar-zxvfqtopia-2.2.0.tar.gz建立两个目录arm_qtopia和x86_qtopia目录把源码分别解压到两个目录中,后面我们会对其分别编译出x86仿真版和arm交叉编译版本qtpioa安装之前需要下载3个补丁包并安装后才能正确编译,4,Qtopia安装,编译Qt库,并且连编实例程序、教程和工具(比如Qt设计器),就像

4、下面这样在解压目录中输入./configure-qte-embedded-no-xft-qconfigqpe-depths16,32-system-jpeg-qt-zlib-qt-libpng-gif-no-g+-exceptions-no-qvfb-xplatformlinux-arm-g+-tslib-qpeeditionpda-displaysize240 x320-fontfamilieshelveticafixedmicrosmallsmoothsmoothtimesunifont-xplatformlinux-arm-g+-luuid-qt2-no-opengl-no-xft-dq

5、t-no-xft-thread该命令会自动检测你目前linux操作系统具体配置情况执行make命令生成qt和qtopia。执行makeinstall系统会把编译好的所有库文件拷贝到$QPEDIR/image目录下在你主机中创建如下脚本文件中设置一些环境变量如下exportQTDIR=/opt/qte/arm_qtopia/qtopia2.2.0/qt2exportQPEDIR=/opt/qte/arm_qtopia/qtopia2.2.0/qtopiaexportPATH=$QTDIR/bin:$QPEDIR/bin:$PATHexportQMAKESPEC=$QPEDIR/mkspecs/q

6、ws/linux-arm-g+exportHOME=opt/qte/arm_qtopia/qtopia2.2.0/image/rootexportLD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATH,5,有关Qt环境变量,QMAKESPEC:这个必须设置为你所使用的系统的平台和编译器的组合。举例来说,加入你使用的是Windows和MicrosoftVisualStudio,你应该把环境变量设置为win32-msvc。如果你使用Solaris和g+,你应该把环境变量设置solaris-g+。QTDIR:这个必须设置到Qt被(或者将被)安装

7、到的地方。比如,/opt/qte/arm_qtopia/qtopia2.2.0/qt2一旦环境变量被设置到qmake目录,$QTDIR/qmakeQPEDIR:这设置为Qtopia的实际安装目录,6,Qt主要开发工具,KdeveloptIDEKDelvelopt是Linux下开源IDE,目前最新版本为3.5.3,它的优点是专门为linux下编写c+的开发工具有速度快易调试等特点.但是没有代码职能感知功能Eclipse+C+DeveloptTool(CDT)+qt插件Eclipse是java开发的IDE工具.它能够通过插件方式支持多种语言如:c+,java,c.要运行Eclipse必须先安装jr

8、e.具有代码智能感知功能QdeveloptIDEQDevelop是专门用于Qt4开发的IDE环境。QDevelop基于Qt4核心,需要安装gcc编译器(windows为MinGW),还需要gdb提供调试功能和ctags实现代码补全功能。QDevelop目前支持英语、法语、德语、荷兰语、波兰语、西班牙语、中文、俄语、意大利语和乌克兰语。QDevelop是和Kdevelop无关的项目。它主要专注于提供Qt的IDE开发环境。虽然还不完善,但是发展很快,并且跨平台。QDevelop和KDevelop具有完全不同的源代码。,7,Qt体系架构,Qt的整个设计都是以单根继承为主这跟java相同.所谓单根继承

9、就是说所有的Qt类都有一个共同的祖先都是QObject类QObject类后面有三个大的子类分别负责不同的功能它们是:QApplicaton:类管理图形用户界面应用程序和控制台程序的控制流和主要设置QWidget:是所有用户界面对象的基类,负责管理图形界面QLayout:负责管理所有图形界面的摆放方式,8,qmake工程文件,工程文件里包含了qmake建立你的应用程序(或者库,插件)所需要的所有信息。你的工程所需的资源通常通过一系列的声明语句来描述,而简单的控制结构,可以实现在不同的平台和环境下,执行不同的编译流程。qmake工程文件是以.pro为扩展名,9,qmake概述,qmake是Trol

10、ltech公司创建的用来为不同的平台和编译器书写Makefile的工具。手写Makefile是比较困难并且容易出错的,尤其是需要给不同的平台和编译器组合写几个Makefile。使用qmake会注意所有的编译器和平台的依赖性,可以把开发者解放出来只关心他们的代码。Trolltech公司使用qmake作为Qt库和Qt所提供的工具的主要连编工具.当Qt被连编的时候,默认情况下qmake也会被连编。qmake使用储存在项目(.pro)文件中的信息来决定Makefile文件中该生成什么。,10,qmake工程文件示例,TEMPLATE=appTARGET=HelloworldDEPENDPATH+=.I

11、NCLUDEPATH+=.SOURCES+=hello.cppHEADERS+=hello.hFORMS+=charGame.uitest_dynmaic.uiCONFIG+=qtwarn_onreleaseCONFIG+=qtdebugCONFIG+=qtthreaddebug,11,pro文件解释,TEMPLATE:表示最终生成得目标文件类型app表示,最终生成得可执行文件TARGET:目标名称是自动设置的,它被设置为和项目文件一样的名称,但是为了适合平台所需要的后缀。DEPENDPATH:应用程序所依赖的搜索路径INCLUDEPATH:应用程序所需的额外的包含路径的列表SOURCES:应

12、用程序得源代码HEADERS:应用程序用到的头文件FORMS:应用程序用到的ui窗体文件CONFIG:包含Qt连接编译得一些配置信息包括:qtwarn_on:编译器会输出尽可能多的警告信息qtwarn_off:编译器会输出尽可能少的警告信息qtdebug:应用程序将以debug模式连编。qtthreaddebug:连编为一个可调试的多线程的应用程序,12,Qt2包含的模块,QtCore和图形无关的核心模块QtGui所有的图形模块QtNetWork网络相关的模块QtOpenGL支持OpenGLQtSqlQT支持数据库开发模块QtSvg定义和生成SVG类QtXML读取XML文件模块QtDesign

13、erQt的图形界面设计QtUiTool定义在应用程序中直接处理ui文件的类Qt3SupportQt3版本的支持QtAssistant定义和扩展Qt设计器的类,13,qmake命令,qmake可以根据实际文件自动生成相对应makefile文件,命令格式:qmakeoptionsfiles,14,Qt体系架构图,15,qmake编译Qt次序,首先使用qmakeproject选项命令,根据当前源代码生成后缀名为pro的工程文件其次再次调用qmake命令或者执行qmakeoM自动生成Makefile文件,16,Qtopia添加线程支持,由于qtopia2.2.

14、0的makefile里的问题,现在只能自己手动编译出支持thread的libqte-mt.so.*进入qtopia-2.2.0-FriendlyARM/qt2目录手动配置来支持multi-thread如果编译的是x86版本那么执行./configure-embedded-no-xft-qconfigqpe-depths16,32-system-jpeg-gif-thread如果编译的是arm版本那么执行./configure-embedded-no-xft-qconfigqpe-depths16,32-system-jpeg-qt-zlib-qt-libpng-gif-no-g+-except

15、ions-no-qvfb-xplatformlinux-arm-g+-tslib-thread上面的步骤执行后会在当前目录下产生src-mt.mk文件,用编辑器将其内容的最后一行”cdsrc;$(MAKE)clean“删除或注释掉编译libqte-mt:makesrc-mt编译完成后将在qtopia-2.2.0-FriendlyARM/qtopia/lib目录下生成所期待的libqte-mt.so.*文件,17,Qt布局管理器绝对位置方式,这种方式是通过QWidge提供的setGeometry()函数来设置子窗口部件大小和在父窗口的位置但是绝对位置方式缺点是:如果父窗口大小发生改变,子窗口部件

16、无法做出相应变化,18,setGeometry()函数,指定子部件在父窗体中所处的位置和大小voidQWidget:setGeometry(intx,inty,intw,inth)参数说明:x:表示子部件在父窗体行的位置y:表示子部件在父窗体列的位置w:表示子部件宽度h:表示子部件的高度,19,绝对位置示例,#include#include#includeintmain(intargc,char*argv)QApplicationapp(argc,argv);QWidget*widget=newQWidget;QLabel*label=newQLabel(HelloQt!“,widget);l

17、abel-setGeometry(10,10,20,20);widget-resize(300,300);widget-show();returnapp.exec();,20,布局管理器类图,QObject,QGridLayout,QVBoxLayout,QBoxLayout,QHBoxLayout,QLayout,21,布局管理器常用方法,setLayout函数:通过调用该函数设置窗口的布局模式setLayoutaddWidgetaddColSpacingsetSpacing,22,QHBoxLayout,#include#include#includeintmain(intargc,cha

18、r*argv)QApplicationapp(argc,argv);QWidget*window=newQWidget;QPushButton*button1=newQPushButton(“OK”);QPushButton*button2=newQPushButton(“cancel”);window-setWindowTitle(EnterYourAge);QHBoxLayout*layout=newQHBoxLayout;layout-addWidget(button1);layout-addWidget(button2);window-setLayout(layout);window-

19、show();returnapp.exec();,23,QVBoxLayout,#include#include#include#include#includeintmain(intargc,char*argv)QApplicationapp(argc,argv);QWidget*window=newQWidget;window-setWindowTitle(QVBoxLayout);window-resize(240,100);QLCDNumber*lcd=newQLCDNumber;QObject:connect(slider,SIGNAL(valueChanged(int),lcd,SL

20、OT(display(int);QVBoxLayout*layout=newQVBoxLayout(window);layout-addWidget(lcd);layout-addWidget(slider);window-show();returnapp.exec();,24,QGridLayout,#include#include#includeintmain(intargc,char*argv)QApplicationapp(argc,argv);QWidget*wm=newQWidget;QLabel*label;QGridLayout*grid=newQGridLayout(wm,3

21、,3);grid-addColSpacing(0,200);grid-addColSpacing(1,100);label=newQLabel(one,wm);grid-addWidget(label,0,0);grid-addWidget(newQLabel(two,wm),1,0);label=newQLabel(three,wm);grid-addWidget(label,2,0);grid-addWidget(newQLabel(four,wm),1,1);label=newQLabel(five,wm);grid-addWidget(label,2,2);app.setMainWid

22、get(wm);wm-show();returnapp.exec();,25,QDialog类,QDialog类是对话框窗口的基类,对话框窗口是主要用于短期任务以及和用户进行简要通讯的顶级窗口,QDialog可以是模式的也可以是非模式的,QDialog支持扩展性并且可以提供返回值,它们可以有默认按钮。,26,对话框模式,模式对话框就是阻塞同一应用程序中其它可视窗口的输入,对话框用户必须完成这个对话框中的交互操作并且关闭了它之后才能访问应用程序中的其它任何窗口非模式对话框是和同一个程序中其它窗口操作无关的对话框。在字处理软件中查找和替换对话框通常是非模式的来允许同时与应用程序主窗口和对话框进行交

23、互。,27,QMessageBox静态成员,StandardButtonQMessageBox:critical(QWidget*parent,constQStringvoidmySignal(intx);voidmySignalParam(intx,inty);在上面的定义中,signals是QT的关键字,而非C/C+的。接下来的一行voidmySignal()定义了信号mySignal,这个信号没有携带参数;接下来的一行voidmySignal(intx)定义了重名信号mySignal,但是它携带一个整形参数,这有点类似于C+中的虚函数。从形式上讲信号的声明与普通的C+函数是一样的,但是信

24、号却没有函数体定义,另外,信号的返回类型都是void。,33,槽,槽是普通的C+成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。同普通的C+成员函数一样,槽函数也分为三种类型,即publicslots、privateslots和protectedslots。槽也能够声明为虚函数,这也是非常有用的。,34,槽函数类型,publicslots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递

25、。protectedslots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。privateslots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。,35,如何编写槽,槽的声明也是在头文件中进行的。例如,下面声明了三个槽:publicslots:voidmySlot();voidmySlot(intx);voidmySignalParam(intx,inty);,36,QObject:connect,通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的

26、槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用,该函数的定义如下:boolQObject:connect(constQObject*sender,constchar*signal,constQObject*receiver,constchar*member)static这个函数的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。当指定信号signal时必须使用QT的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话,那么在connect调用中接收者参数可以省略。,37,带有信号和

27、槽的类,classTsignalApp:publicQMainWindowQ_OBJECT/信号声明区signals:/声明信号mySignal()voidmySignal();/声明信号mySignal(int)voidmySignal(intx);/声明信号mySignalParam(int,int)voidmySignalParam(intx,inty);/槽声明区publicslots:/声明槽函数mySlot()voidmySlot();/声明槽函数mySlot(int)voidmySlot(intx);/声明槽函数mySignalParam(int,int)voidmySignal

28、Param(intx,inty);,38,一个信号与另一个信号相关联,classMyWidget:publicQWidgetpublic:MyWidget();.signals:voidaSignal();.private:.QPushButton*aButton;MyWidget:MyWidget()aButton=newQPushButton(this);connect(aButton,SIGNAL(clicked(),SIGNAL(aSignal();,39,信号和槽示例,下面定义了两个对象:标签对象label和滚动条对象scroll,并将valueChanged()信号与标签对象的se

29、tNum()相关联,另外信号还携带了一个整形参数,这样标签总是显示滚动条所处位置的值。QLabel*label=newQLabel;QScrollBar*scroll=newQScrollBar;QObject:connect(scroll,SIGNAL(valueChanged(int),label,SLOT(setNum(int);,40,QObject:disconnect,当信号与槽没有必要继续保持关联时,我们可以使用disconnect函数来断开连接。boolQObject:disconnect(constQObject*sender,constchar*signal,constOb

30、ject*receiver,constchar*member)static,41,信号和槽限制,类型宏不能被用于信号和槽的参数#ifdefultrix#defineSIGNEDNESS(a)unsigneda#else#defineSIGNEDNESS(a)a#endifclassWhatever:publicQObject.signals:voidsomeSignal(SIGNEDNESS(int);/错误.;,42,信号和槽限制,构造函数不能用于信号部分和槽部分classSomeClass:publicQObjectQ_OBJECTpublicslots:SomeClass(QObject

31、*parent,constchar*name):QObject(parent,name)/错误.;,43,信号和槽限制,函数指针不能作为信号或槽的参数classSomeClass:publicQObjectQ_OBJECT.publicslots:voidapply(void(*apply)(List*,void*),char*);/错误;,44,信号和槽限制,信号和槽不能被升级QButtonGroup:buttonPressed()槽是保护的。classWhatever:publicQButtonGroup.publicslots:voidQButtonGroup:buttonPressed

32、;/错的.;,45,信号和槽限制,如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。信号与槽不能有缺省参数。信号与槽也不能携带模板类参数。嵌套的类不能位于信号或槽区域内也不能有信号或者槽。友元声明不能位于信号或者槽声明区内。,46,元对象工具,元对象编译器moc(metaobjectcompiler)对C+文件中的类声明进行分析并产生用于初始化元对象的C+代码,元对象包含全部信号和槽的名字以及指向这些函数的指针。元对象代码是signal/slot机制所必须的。用moc产生的C+源文件必须与类实现一起进行编译和连接,或者用#include语句将其包含到

33、类的源文件中。moc并不扩展#include或者#define宏定义,它只是简单的跳过所遇到的任何预处理指令。,47,moc编译,moc元对象编译器的功能是把包含有信号和槽的源文件编译成特殊的文件名为moc_+实际源文件名称.它的具体使用格式如下:mocoptionmocmysingal.h-omoc_mysingal.hoption包含如下参数:-o把编译结果写到一个文件中而不是标志输出-p-ppath使元对象编译器生成的(如果有生成的)#include声明的文件名称中预先考虑到path/。-qpath使元对象编译器在生成的文件中的qt#include文件的名称中预先考虑到path/。,48

34、,类声明位置,类的声明放在一个头文件(.h文件)中如果在上述的文件myclass.h中发现类的声明,元对象编译器的输出文件将会被放在一个叫moc_myclass.cpp的文件中。这个文件将会像通常情况一样被编译,作为对象文件的结果是moc_myclass.o类的声明放在一个实现文件(.cpp文件)中如果上述的文件myclass.cpp中发现类的声明,元对象编译器的输出文件将会被放在一个叫myclass.moc的文件中。这个文件需要被实现文件包含(#include),也就是说myclass.cpp需要包含下面这行#includemyclass.moc放在所有的代码之后。,49,事件机制,Qt中定

35、义的事件是一个从QEvent类继承下来的,它表示应用程序内部或者外部发生某些应用程序必须知道的事情在Qt内部,Qt通过由函数QApplication:exec()函数启动的主事件循环从系统事件队列中抓取属于本程序事件并转化为QEvent对象,50,事件类图,QEvent,QMouseEvent,QFocusEvent,QObject,QKeyEvent,QPaintEvent,QMoveEvent,QResizeEvent,51,事件来源分类,基于事件如何被产生与分发,可以把事件分为三类:Spontaneous事件,由窗口系统产生,它们被放到系统队列中,通过事件循环逐个处理。Posted事件,

36、由Qt或是应用程序产生,它们被Qt组成队列,再通过事件循环处理。Sent事件,由Qt或是应用程序产生,但它们被直接发送到目标对象。,52,QEvent对象,QEvent对象是所有事件对象的基类,因此有必要了解该对象构成函数:enumType标识事件类型Typetype()const调用该函数,返回事件发生事件的类型(该类型为枚举),53,常用的事件类型,通过调用QEvent:type函数可以返回具体事件类型,Qt已经为具体的事件类型事先定义了:QEvent:MouseButtonPress-鼠标按下,QMouseEvent。QEvent:MouseButtonRelease-鼠标抬起,QMou

37、seEvent。QEvent:MouseButtonDblClick-鼠标再次按下QEvent:MouseMove-鼠标移动,QMouseEvent。QEvent:Close-窗口部件被关闭(永久性地)QCloseEvent。QEvent:KeyPress-键按下(举例,包括Shift)QKeyEvent。QEvent:KeyRelease-键抬起,QKeyEvent。QEvent:FocusIn-窗口部件获得键盘焦点,QFocusEvent。QEvent:FocusOut-窗口部件失去键盘焦点,QFocusEvent。QEvent:Timer-规则的定时器事件,QTimerEvent。,54

38、,常用的Qt事件类,Qt为多数事件定义了特殊的类:QMouseEvent鼠标事件QKeyEvent键盘事件QResizeEvent窗体宿放事件QPaintEvent窗体重绘事件QCloseEvent窗体关闭事件QFocusEvent部件获得焦点事件,55,事件处理方法,Qt提供了几种处理事件的方法:重新实现特定的事件处理器重新实现QObject:event()函数继承QApplication并重新实现notify()函数,56,实现特定的事件处理器,最常见的事件处理办法就是重载象mousePressEvent(),keyPressEvent(),paintEvent()这样的特定事件处理函数.

39、以按键事件为例,57,QKeyEvent对象,QKeyEvent对象是Qt的键盘事件的包装对象,我们也经常需要捕获键盘事件,下面是该对象主要成员函数:intkey()constintascii()constButtonStatestate()constButtonStatestateAfter()constboolisAccepted()constQStringtext()constboolisAutoRepeat()constintcount()constvoidaccept()voidignore(),58,Qt键盘常量,为了方便程序员捕获特殊键,Qt已经对所有的键盘都进行了宏定义,下面列出常用的键值:,59,QMouseEvent对象,在Qt系统中对所有鼠标事件都被封装为QMouseEvent对象,有必要了解下该对象成员函数Qt:MouseButtonbutton()const返回发生鼠标事件时按下的鼠标按钮constQPointbr

温馨提示

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

评论

0/150

提交评论