Qt编程培训PPT课件

上传人:桔**** 文档编号:570033146 上传时间:2024-08-01 格式:PPT 页数:67 大小:187KB
返回 下载 相关 举报
Qt编程培训PPT课件_第1页
第1页 / 共67页
Qt编程培训PPT课件_第2页
第2页 / 共67页
Qt编程培训PPT课件_第3页
第3页 / 共67页
Qt编程培训PPT课件_第4页
第4页 / 共67页
Qt编程培训PPT课件_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《Qt编程培训PPT课件》由会员分享,可在线阅读,更多相关《Qt编程培训PPT课件(67页珍藏版)》请在金锄头文库上搜索。

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

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

3、础类库。pQtopiaCore:就是原来的Qt/E,大概从Qt4开始改名,把QtopiaCore并到Qtopia的产品线中去了。但实际上QtopiaCore就相当于原来的Qt/E,仍然作为基础类库。3Qtopia安装安装p从网站上下载的qt文件qtopia-2.2.0.tar.gz,拷贝到一个单独目录中.推荐放在opt目录下单独解压tar-zxvfqtopia-2.2.0.tar.gzp建立两个目录arm_qtopia和x86_qtopia目录把源码分别解压到两个目录中,后面我们会对其分别编译出x86仿真版和arm交叉编译版本pqtpioa安装之前需要下载3个补丁包并安装后才能正确编译4Qto

4、pia安装安装p编译Qt库,并且连编实例程序、教程和工具(比如Qt设计器),就像下面这样在解压目录中输入./configure -qte -embedded -no-xft -qconfig qpe -depths 16,32 -system-jpeg -qt-zlib -qt-libpng -gif -no-g+-exceptions -no-qvfb -xplatform linux-arm-g+ -tslib -qpe edition pda -displaysize 240x320 -fontfamilies helvetica fixed micro smallsmooth smoo

5、thtimes unifont -xplatform linux-arm-g+ -luuid -qt2 -no-opengl -no-xft -dqt -no-xft -thread该命令会自动检测你目前linux操作系统具体配置情况执行make命令生成qt和qtopia。执行makeinstall系统会把编译好的所有库文件拷贝到$QPEDIR/image目录下p在你主机中创建如下脚本文件中设置一些环境变量如下export QTDIR=/opt/qte/arm_qtopia/qtopia2.2.0/qt2 export QPEDIR = /opt/qte/arm_qtopia/qtopia2.

6、2.0/qtopiaexport PATH=$QTDIR/bin:$QPEDIR/bin:$PATHexport QMAKESPEC= $QPEDIR/mkspecs/qws/linux-arm-g+export HOME=opt/qte/arm_qtopia/qtopia2.2.0/image/rootexport LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATH 5有关有关Qt环境变量环境变量pQMAKESPEC:这个必须设置为你所使用的系统的平台和编译器的组合。举例来说,加入你使用的是Windows和MicrosoftVisu

7、alStudio,你应该把环境变量设置为win32-msvc。如果你使用Solaris和g+,你应该把环境变量设置solaris-g+。pQTDIR:这个必须设置到Qt被(或者将被)安装到的地方。比如,/opt/qte/arm_qtopia/qtopia2.2.0/qt2一旦环境变量被设置到qmake目录,$QTDIR/qmakepQPEDIR:这设置为Qtopia的实际安装目录6Qt主要开发工具主要开发工具pKdeveloptIDEKDelvelopt是Linux下开源IDE,目前最新版本为3.5.3,它的优点是专门为linux下编写c+的开发工具有速度快易调试等特点.但是没有代码职能感知功

8、能pEclipse+C+DeveloptTool(CDT)+qt插件Eclipse是java开发的IDE工具.它能够通过插件方式支持多种语言如:c+,java,c.要运行Eclipse必须先安装jre.具有代码智能感知功能pQdeveloptIDEQDevelop是专门用于Qt4开发的IDE环境。QDevelop基于Qt4核心,需要安装gcc编译器(windows为MinGW),还需要gdb提供调试功能和ctags实现代码补全功能。QDevelop目前支持英语、法语、德语、荷兰语、波兰语、西班牙语、中文、俄语、意大利语和乌克兰语。QDevelop是和Kdevelop无关的项目。它主要专注于提供

9、Qt的IDE开发环境。虽然还不完善,但是发展很快,并且跨平台。QDevelop和KDevelop具有完全不同的源代码。7Qt体系架构体系架构pQt的整个设计都是以单根继承为主这跟java相同.所谓单根继承就是说所有的Qt类都有一个共同的祖先都是QObject类pQObject类后面有三个大的子类分别负责不同的功能它们是:QApplicaton:类管理图形用户界面应用程序和控制台程序的控制流和主要设置QWidget:是所有用户界面对象的基类,负责管理图形界面QLayout:负责管理所有图形界面的摆放方式8qmake工程文件工程文件p工程文件里包含了qmake建立你的应用程序(或者库,插件)所需要

10、的所有信息。你的工程所需的资源通常通过一系列的声明语句来描述,而简单的控制结构,可以实现在不同的平台和环境下,执行不同的编译流程。pqmake工程文件是以.pro为扩展名9qmake概述概述pqmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。p手写Makefile是比较困难并且容易出错的,尤其是需要给不同的平台和编译器组合写几个Makefile。使用qmake会注意所有的编译器和平台的依赖性,可以把开发者解放出来只关心他们的代码。Trolltech公司使用qmake作为Qt库和Qt所提供的工具的主要连编工具.当Qt被连编的时候,默认情况下qmake也会

11、被连编。pqmake使用储存在项目(.pro)文件中的信息来决定Makefile文件中该生成什么。10qmake工程文件示例工程文件示例TEMPLATE=appTARGET=HelloworldDEPENDPATH+=.INCLUDEPATH+=.SOURCES+=hello.cppHEADERS+=hello.hFORMS+=charGame.uitest_dynmaic.uiCONFIG+=qtwarn_onreleaseCONFIG+=qtdebugCONFIG+=qtthreaddebug11pro文件解释文件解释pTEMPLATE:表示最终生成得目标文件类型app表示,最终生成得可执

12、行文件pTARGET:目标名称是自动设置的,它被设置为和项目文件一样的名称,但是为了适合平台所需要的后缀。DEPENDPATH:应用程序所依赖的搜索路径pINCLUDEPATH:应用程序所需的额外的包含路径的列表pSOURCES:应用程序得源代码pHEADERS:应用程序用到的头文件pFORMS:应用程序用到的ui窗体文件pCONFIG:包含Qt连接编译得一些配置信息包括:qtwarn_on:编译器会输出尽可能多的警告信息qtwarn_off:编译器会输出尽可能少的警告信息qtdebug:应用程序将以debug模式连编。qtthreaddebug:连编为一个可调试的多线程的应用程序12Qt2包

13、含的模块包含的模块pQtCore和图形无关的核心模块pQtGui所有的图形模块pQtNetWork网络相关的模块pQtOpenGL 支持OpenGLpQtSqlQT支持数据库开发模块pQtSvg定义和生成SVG类pQtXML读取XML文件模块pQtDesignerQt的图形界面设计pQtUiTool定义在应用程序中直接处理ui文件的类pQt3Support Qt3版本的支持pQtAssistant 定义和扩展Qt设计器的类13qmake命令命令pqmake可以根据实际文件自动生成相对应makefile文件,命令格式:qmake options files 14Qt体系架构图体系架构图15qma

14、ke编译编译Qt次序次序qmake工程文件(pro)qmake -projectqmakeMakefile文件p首先使用qmake project选项命令,根据当前源代码生成后缀名为pro的工程文件p其次再次调用qmake命令或者执行qmake o Makefile helloworld.pro自动生成Makefile文件16Qtopia添加线程支持添加线程支持p由于qtopia2.2.0的makefile里的问题,现在只能自己手动编译出支持thread的libqte-mt.so.*进入qtopia-2.2.0-FriendlyARM/qt2目录手动配置来支持multi-thread如果编译的

15、是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+-exceptions-no-qvfb-xplatformlinux-arm-g+-tslib-thread上面的步骤执行后会在当前目录下产生src-mt.mk文件,用编辑器将其内容的最后一行”cdsrc;$(MAKE)cl

16、ean“删除或注释掉编译libqte-mt:makesrc-mtp编译完成后将在qtopia-2.2.0-FriendlyARM/qtopia/lib目录下生成所期待的libqte-mt.so.*文件17Qt布局管理器布局管理器绝对位置方式绝对位置方式p这种方式是通过QWidge提供的setGeometry()函数来设置子窗口部件大小和在父窗口的位置p但是绝对位置方式缺点是:如果父窗口大小发生改变,子窗口部件无法做出相应变化18setGeometry()函数函数p指定子部件在父窗体中所处的位置和大小voidQWidget:setGeometry(intx,inty,intw,inth)参数说明

17、:x:表示子部件在父窗体行的位置y:表示子部件在父窗体列的位置w:表示子部件宽度h:表示子部件的高度19绝对位置示例绝对位置示例#include#include#includeintmain(intargc,char*argv)QApplicationapp(argc,argv);QWidget*widget=newQWidget;QLabel*label=newQLabel(HelloQt!“,widget);label-setGeometry(10,10,20,20);widget-resize(300,300);widget-show();returnapp.exec();20布局管理器

18、类图布局管理器类图QObjectQGridLayoutQVBoxLayoutQBoxLayoutQHBoxLayoutQLayout21布局管理器常用方法布局管理器常用方法psetLayout函数:通过调用该函数设置窗口的布局模式setLayoutaddWidgetaddColSpacingsetSpacing22QHBoxLayout#include#include#includeintmain(intargc,char*argv) QApplicationapp(argc,argv);QWidget*window=newQWidget;QPushButton*button1=newQPus

19、hButton(“OK”);QPushButton*button2=newQPushButton(“cancel”);window-setWindowTitle(EnterYourAge);QHBoxLayout*layout=newQHBoxLayout;layout-addWidget(button1);layout-addWidget(button2);window-setLayout(layout);window-show();returnapp.exec();23QVBoxLayout#include#include#include#include#includeintmain(in

20、targc,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,SLOT(display(int);QVBoxLayout *layout = new QVBoxLayout(window);layout-addWidget(lcd);layout

21、-addWidget(slider);window-show();returnapp.exec();24QGridLayout#include#include#includeintmain(intargc,char*argv)QApplicationapp(argc,argv);QWidget*wm=newQWidget;QLabel*label;QGridLayout*grid=newQGridLayout(wm,3,3);grid-addColSpacing(0,200);grid-addColSpacing(1,100);label=newQLabel(one,wm);grid-addW

22、idget(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.setMainWidget(wm);wm-show();returnapp.exec();25QDialog类类pQDialog类是对话框窗口的基类,对话框窗口是主要用于短期任务以及和用户进行简要通

23、讯的顶级窗口,QDialog可以是模式的也可以是非模式的,QDialog支持扩展性并且可以提供返回值,它们可以有默认按钮。26对话框模式对话框模式p模式模式对话框就是阻塞同一应用程序中其它可视窗口的输入,对话框用户必须完成这个对话框中的交互操作并且关闭了它之后才能访问应用程序中的其它任何窗口p非模式非模式对话框是和同一个程序中其它窗口操作无关的对话框。在字处理软件中查找和替换对话框通常是非模式的来允许同时与应用程序主窗口和对话框进行交互。27QMessageBox静态成员静态成员pStandardButtonQMessageBox:critical(QWidget*parent,constQS

24、tring&caption,constQString&text,StandardButtonsbuttons=Ok,StandardButtondefaultButton=NoButton)打开一个标题为caption并且文本为text的严重消息框。这个对话框最多有三个按钮。pintwarning(QWidget*parent,constQString&caption,constQString&text,intbutton0,intbutton1,intbutton2=0)打开一个标题为caption并且文本为text的警告消息框。这个对话框最多有三个按钮。pStandardButtoninf

25、ormation(QWidget*parent,constQString&title,constQString&text,StandardButtonsbuttons=Ok,StandardButtondefaultButton=NoButton)打开一个标题为caption并且文本为text的信息消息框。这个对话框最多有三个按钮。28QDialog常用函数常用函数pexec函数调用exec()来显示模式对话框。当用户关闭这个对话框,exec()将提供一个可用的返回值并且这时流程控制继续从调用exec()的地方进行paccept()槽在使用模式对话框,隐藏模式对话框并且设置结果代码为Accep

26、ted。preject()槽隐藏模式对话框并且设置结果代码为Rejected。pshow()调用show()来显示非模式对话框,show()立即返回29Qt信号和槽概述信号和槽概述p信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本章介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。p信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C+语言,因此要正确的处理信号和槽,必须借助一个称为

27、moc(MetaObjectCompiler)的QT工具,该工具是一个C+预处理程序,它为高层次的事件处理自动生成所需要的附加代码。p在所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。30信号和槽示意图信号和槽示意图31信号信号p当某个信号对其客户或所有者发生的内部状

28、态发生改变,信号被一个对象发射。p只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。p信号-槽机制完全独立于任何GUI事件循环。p如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。32如何编写信号如何编写信号p信号的声明是在头文件中进行的,QT的signals关键字指出进入了信号声明区,随后即可声明自己的信号。下面定义了三个信号:signals:voidmySignal();voidmySignal(

29、intx);voidmySignalParam(intx,inty);p在上面的定义中,signals是QT的关键字,而非C/C+的。接下来的一行voidmySignal()定义了信号mySignal,这个信号没有携带参数;接下来的一行voidmySignal(intx)定义了重名信号mySignal,但是它携带一个整形参数,这有点类似于C+中的虚函数。从形式上讲信号的声明与普通的C+函数是一样的,但是信号却没有函数体定义,另外,信号的返回类型都是void。33槽槽p槽是普通的C+成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。

30、槽可以有参数,但槽的参数不能有缺省值。p同普通的C+成员函数一样,槽函数也分为三种类型,即publicslots、privateslots和protectedslots。p槽也能够声明为虚函数,这也是非常有用的。34槽函数类型槽函数类型ppublicslots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。pprotectedslots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。pprivateslots

31、:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。35如何编写槽如何编写槽p槽的声明也是在头文件中进行的。例如,下面声明了三个槽:publicslots:voidmySlot();voidmySlot(intx);voidmySignalParam(intx,inty);36QObject:connectp通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用,该函数的定义如下:boolQObject:connect(constQObject*sender,constchar

32、*signal,constQObject*receiver,constchar*member)static这个函数的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。当指定信号signal时必须使用QT的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话,那么在connect调用中接收者参数可以省略。37带有信号和槽的类带有信号和槽的类classTsignalApp:publicQMainWindowQ_OBJECT/信号声明区signals:/声明信号mySignal()voidmySign

33、al();/声明信号mySignal(int)voidmySignal(intx);/声明信号mySignalParam(int,int)voidmySignalParam(intx,inty);/槽声明区publicslots:/声明槽函数mySlot()voidmySlot();/声明槽函数mySlot(int)voidmySlot(intx);/声明槽函数mySignalParam(int,int)voidmySignalParam(intx,inty);38一个信号与另一个信号相关联一个信号与另一个信号相关联classMyWidget:publicQWidgetpublic:MyWid

34、get();.signals:voidaSignal();.private:.QPushButton*aButton;MyWidget:MyWidget()aButton=newQPushButton(this);connect(aButton,SIGNAL(clicked(),SIGNAL(aSignal();39信号和槽示例信号和槽示例p下面定义了两个对象:标签对象label和滚动条对象scroll,并将valueChanged()信号与标签对象的setNum()相关联,另外信号还携带了一个整形参数,这样标签总是显示滚动条所处位置的值。QLabel*label=newQLabel;QScr

35、ollBar*scroll=newQScrollBar;QObject:connect(scroll,SIGNAL(valueChanged(int),label,SLOT(setNum(int);40QObject:disconnectp当信号与槽没有必要继续保持关联时,我们可以使用disconnect函数来断开连接。boolQObject:disconnect(constQObject*sender,constchar*signal,constObject*receiver,constchar*member)static41信号和槽限制信号和槽限制类型宏不能被用于信号和槽的参数类型宏不能被

36、用于信号和槽的参数#ifdefultrix#defineSIGNEDNESS(a)unsigneda#else#defineSIGNEDNESS(a)a#endifclassWhatever:publicQObject.signals:voidsomeSignal(SIGNEDNESS(int);/错误错误.;42信号和槽限制信号和槽限制构造函数不能用于信号部分和槽部分构造函数不能用于信号部分和槽部分classSomeClass:publicQObjectQ_OBJECTpublicslots:SomeClass(QObject*parent,constchar*name):QObject(p

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

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

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

40、clude文件的名称中预先考虑到path/。48类声明位置类声明位置p类的声明放在一个头文件(类的声明放在一个头文件(.h文件文件)中)中如果在上述的文件myclass.h中发现类的声明,元对象编译器的输出文件将会被放在一个叫moc_myclass.cpp的文件中。这个文件将会像通常情况一样被编译,作为对象文件的结果是moc_myclass.op类的声明放在一个实现文件(类的声明放在一个实现文件(.cpp文件文件)中)中如果上述的文件myclass.cpp中发现类的声明,元对象编译器的输出文件将会被放在一个叫myclass.moc的文件中。这个文件需要被实现文件包含(#include),也就是

41、说myclass.cpp需要包含下面这行#includemyclass.moc放在所有的代码之后。49事件机制事件机制pQt中定义的事件是一个从QEvent类继承下来的,它表示应用程序内部或者外部发生某些应用程序必须知道的事情p在Qt内部,Qt通过由函数QApplication:exec()函数启动的主事件循环从系统事件队列中抓取属于本程序事件并转化为QEvent对象50事件类图事件类图QEventQMouseEventQFocusEventQObjectQKeyEventQPaintEventQMoveEventQResizeEvent51事件来源分类事件来源分类p基于事件如何被产生与分发,

42、可以把事件分为三类:Spontaneous事件,由窗口系统产生,它们被放到系统队列中,通过事件循环逐个处理。Posted事件,由Qt或是应用程序产生,它们被Qt组成队列,再通过事件循环处理。Sent事件,由Qt或是应用程序产生,但它们被直接发送到目标对象。52QEvent对象对象pQEvent对象是所有事件对象的基类,因此有必要了解该对象构成函数:enumType标识事件类型Typetype()const调用该函数,返回事件发生事件的类型(该类型为枚举)53常用的事件类型常用的事件类型p通过调用QEvent:type函数可以返回具体事件类型,Qt已经为具体的事件类型事先定义了:QEvent:M

43、ouseButtonPress-鼠标按下,QMouseEvent。QEvent:MouseButtonRelease-鼠标抬起,QMouseEvent。QEvent:MouseButtonDblClick-鼠标再次按下QEvent:MouseMove-鼠标移动,QMouseEvent。QEvent:Close-窗口部件被关闭(永久性地)QCloseEvent。QEvent:KeyPress-键按下(举例,包括Shift)QKeyEvent。QEvent:KeyRelease-键抬起,QKeyEvent。QEvent:FocusIn-窗口部件获得键盘焦点,QFocusEvent。QEvent:F

44、ocusOut-窗口部件失去键盘焦点,QFocusEvent。QEvent:Timer-规则的定时器事件,QTimerEvent。54常用的常用的Qt事件类事件类pQt为多数事件定义了特殊的类:QMouseEvent鼠标事件QKeyEvent键盘事件QResizeEvent窗体宿放事件QPaintEvent窗体重绘事件QCloseEvent窗体关闭事件QFocusEvent部件获得焦点事件55事件处理方法事件处理方法pQt提供了几种处理事件的方法:重新实现特定的事件处理器重新实现QObject:event()函数继承QApplication并重新实现notify()函数56实现特定的事件处理器

45、实现特定的事件处理器p最常见的事件处理办法就是重载象mousePressEvent(),keyPressEvent(),paintEvent()这样的特定事件处理函数.以按键事件为例57QKeyEvent对象对象pQKeyEvent对象是Qt的键盘事件的包装对象,我们也经常需要捕获键盘事件,下面是该对象主要成员函数:intkey()constintascii()constButtonStatestate()constButtonStatestateAfter()constboolisAccepted()constQStringtext()constboolisAutoRepeat()const

46、intcount()constvoidaccept()voidignore()58Qt键盘常量键盘常量p为了方便程序员捕获特殊键,Qt已经对所有的键盘都进行了宏定义,下面列出常用的键值:键值键值含义含义Qt:Key_EscapeESC键Qt:Key_TabTab键Qt:Key_Backspace回退键Qt:Key_Enter回车键Qt:Key_Down向下键Qt:Key_Space空格键Qt:Key_F1F1键Qt:Key_Right向右键59QMouseEvent对象对象p在Qt系统中对所有鼠标事件都被封装为QMouseEvent对象,有必要了解下该对象成员函数Qt:MouseButtonb

47、utton()const返回发生鼠标事件时按下的鼠标按钮constQPoint&globalPos()const返回发生鼠标事件时,鼠标在屏幕上的位置指针intglobalX()const返回发生鼠标事件时,鼠标在屏幕上x轴位置intglobalY()const返回发生鼠标事件时,鼠标在屏幕上y轴位置intx()const返回发生鼠标事件时,相对与本窗体的x轴位置inty()const返回发生鼠标事件时,相对与本窗体的x轴位置60事件处理器实现事件处理器实现voidimageView:keyPressEvent(QKeyEvent*event)switch(event-key()caseKey

48、_Plus:zoomIn();break;caseKey_Minus:zoomOut();break;caseKey_Left:/default:QWidget:keyPressEvent(event);61重载重载event()函数函数p通过重载event()函数,我们可以在事件被特定的事件处理函数处理之前(象keyPressEvent()处理它.比如,当我们想改变tab键的默认动作时,一般要重载这个函数.在处理一些不常见的事件当我们重载event()函数时,需要调用父类的event()函数来处理我们不需要处理或是不清楚如何处理的事件。62重载重载event实现实现下面这个例子演示了如何重载

49、event()函数,改变Tab键的默认动作:(默认的是键盘焦点移动到下一个控件上.)boolCodeEditor:event(QEvent*event)if(event-type()=QEvent:KeyPress)QKeyEvent*keyEvent=(QKeyEvent*)event;if(keyEvent-key()=Key_Tab)insertAtCurrentPosition(t);returntrue;returnQWidget:event(event);63Qapplication:notify()pQt是用QApplication:notify()函数来分发事件的,想要在任何事

50、件过滤器查看任何事件之前先得到这些事件,重载这个函数是唯一的办法.通常来说事件过滤器更好用一些,因为不需要去继承QApplication类.而且可以给QApplication对象安装任意个数的事件过滤器,相比之下,notify()函数只有一个。64事件过滤器事件过滤器pQt事件模型中有一项非常强大的功能是一个Object实例可以监视另外一个QObject实例中的事件,实现方法就是在目标对象安装事件过滤器,这样事件到达目标对象之前首先获得该事件,从而起到监视作用65安装事件过滤器安装事件过滤器p安装事件过滤器有两个步骤:(假设要用A来监视过滤B的事件)首先调用B的installEventFilt

51、er(constQOject*obj),以A的指针作为参数.这样所有发往B的事件都将先由A的eventFilter()处理.然后,A要重载QObject:eventFilter()函数,在eventFilter()中书写对事件进行处理的代码.66事件过滤器实现事件过滤器实现MainWidget:MainWidget()/CodeEditor*ce=newCodeEditor(this,“codeeditor”);ce-installEventFilter(this);/boolMainWidget:eventFilter(QOject*target,QEvent*event)if(target=ce)if(event-type()=QEvent:KeyPress)QKeyEvent*ke=(QKeyEvent*)event;if(ke-key()=Key_Tab)ce-insertAtCurrentPosition(t);returntrue;returnfalse;67

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号