二 信号与槽PPT课件_第1页
二 信号与槽PPT课件_第2页
二 信号与槽PPT课件_第3页
二 信号与槽PPT课件_第4页
二 信号与槽PPT课件_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

第二章信号对插槽、信号对插槽是QT的核心特性,是应用于对象间通信的高级接口。信号和时隙机制是Qt的一种非常重要的机制,是Qt几乎贯穿Qt整个学习过程的固有机制。信号和插槽简介预定义的信号和插槽自定义信号和插槽,本章要点:用户在GUI用户界面中操作窗口部件时,需要额外的窗口响应,或者可以激活其他任务。在您所知的许多GUI工具包中,窗口小部件(小部件)具有响应它们可能触发的每个动作的回调函数。此回调函数通常是指向函数的指针。但是,在QT中,信号和插槽取代了这些杂乱的函数指针,因此可以更简洁地编写这些通信程序。2.1了解信号和插槽,派生自QObject或其子类(例如Qwidget)的任何类都可以包含信号和插槽。物件变更状态时,会由该物件发出讯号。也就是说,对象是要做的所有事情,不知道另一边在接收信号。此过程是真正的信息包,可确保对象用作真正的软件组件。插槽用于接收信号,但它是常用的对象成员函数。一个插槽不知道什么信号与自己连接。而且对象不了解特定的通信机制。信号和插槽是qobject 336363603360 connect(const qobject * sender、constchar * sigal、constqobject * receiver、const,Qt 33363603360 connectiontype可通过三种方式连接信号和插槽:Qt 3336363603360直接连接:信号发送后立即发送到关联插槽,并且仅在执行插槽函数后发送信号“emit”后执行代码。Qt:QueuedConnection:无论插槽函数是否运行,信号都将发送并转发到插槽。Qt :3360 autocompatconnection:如果信号和插槽位于同一线程中,则在信号运行后立即运行插槽函数,并且Qt信号和插槽机制的优点:类型安全性:关联信号和插槽的参数类型和参数数必须相同。松散耦合:Qt信号和插槽机制降低了Qt对象的耦合度。如果对客户或所有者发出的内部状态的信号发生更改,则信号将由一个对象发送。只有定义此信号的类和派生类才能传输此信号。发送信号时,与此相关联的插槽将立即运行,就像正常函数调用一样。信号和插槽机制完全独立于所有GUI事件循环。如果有多个插槽与信号相关联,则在发送信号时,每个插槽都将运行。但是,执行顺序是随机的、不确定的,不能随机指定哪个先执行,哪个接下来执行。2.2在预定义的信标和插槽实例、标头文件中执行了信标声明,QT的signals关键字指示已进入信号声明区域。然后可以声明自己的信号。例如,下面定义了信号: voidmysignal()的三个信号VoidmySignal(intx);VoidmySignalParam(intx,inty);信号、插槽是典型的c成员函数,可以正常调用。唯一的特殊性是,很多信号可以关联。此插槽在发送关联的信号时调用。槽可以有参数,但槽的参数不能有默认值。插槽和插槽是常见的成员函数,因此它们与其他函数一样具有权限。插槽的权限决定了谁可以关联。与常见的c成员函数一样,插槽函数也分为三种类型:publicslots。在此区域中声明的插槽意味着所有对象都可以连接信号。Protectedslots:在此区域中声明的插槽表示当前类及其子类可以连接信号。Privateslots:在此区域中声明的插槽表示只有类本身才能连接信号。插槽的声明也在头文件中执行。例如,下面声明了三个名为publicslots:voidmySlot()的插槽,void myslot(intx);VoidmySignalParam(intx,inty);调用QObject对象的connect函数,以将一个对象的信号与另一个对象的slot函数相关联,从而在发射器发送信号时调用接收方的slot函数。此函数包含bool qobject 3363636363636360 connect(const qobject * sender、const char * sigal、constqobject * receiver、const qobject * receiver)请看以下示例:class mywidget : public qwidget public : my widget();signals : void SIG 1();private :qpushbutton * button1 my widget 3363603360 my widget() button 1=newq push button(this);Connect (button1,signal (clicked(),sigal(SIG 1();,可以在不需要继续连接信号和插槽的情况下使用disconnect函数断开连接。bool qobject 3363603360 disconnect(const qobject * sender、const char * sigal、constobject * receiver、const char,有三种情况需要使用disconnect()函数断开与对象关联的对象:Disconnect(myObject,0,0,0 0,0)断开与特定信号的连接。Disconnect (myobject,signal (mysignal(),0,0)断开两个对象之间的连接。Disconnect (myobject,0,myreceiver,0)和元对象编译器元对象编译器metaobject compiler(MOC)分析c文件的类声明,并生成c代码以初始化包含所有信号和插槽的名称以及指向这些函数的指针的元对象。signal/slot机制需要元对象代码。Moc生成的c源文件必须与类实现一起编译和链接,或者必须使用#include语句包含在类的源文件中。Moc不扩展#include或#define宏定义,只是跳过发生的预处理命令。编译后,还将创建链接文件sigtest_moc.o。元对象工具、信号和插槽函数的声明通常位于头文件中,需要在类声明的开始位置添加Q_OBJECT语句;此语句是必需的,用于通知编译器在编译之前必须应用MOC工具进行扩展。Signals将显示后续启动信号声明,与slots不同,signals没有public、private、protected等属性。此外,signals,slots关键字由QT自行定义,不是c的关键字。程序示例、信号和插槽之间的连接必须事先由connect函数指定。要断开两者之间的连接,可以使用disconnect函数。/t signal.h.classtsignalapp : publicqmakewindow q _ object./信号声明区域signals : voidmysignal();/声明信号my signal()void my signal(intx);/声明信号mysignal(int)voidmysignalparam(intx,inty);/声明信号mySignalParam(int,int)/插槽声明区域publics lots : voidmyslot();/声明插槽函数mySlot()voidmySlot(intx)。/声明插槽函数my slot(int)voidmysignalparam(intx,inty)。/插槽函数mySignalParam(int,int),/tsignal.cpp.tsignalapp 3363603360 tsignalapp()./将信号mySignal()连接到插槽my slot()connect(this,signal (mysignal(),slot(my slot();/将信号mySignal(int)连接到插槽my slot(int)connect(this,signal(my signal(int)slot(my slot(my slot(my slot)/将信号mySignalParam(int,int)与插槽mySlotParam(int,int)连接connect (this,signal (mysignalparam(),/插槽函数定义my slot()voidtsignalapp 3363603360 my slot() qmessagebox 3363603360 about(this, t signal)/插槽函数定义my slot(int)voidtsignalapp 33603360 my slot(intx) qmessagebox 33603360 about(this, t signalapp 33603360 about);,/插槽函数myslotparam (int,int)voidtsignalapp 33603360 myslotparam(intx,inty) chars 256Sprintf (s,“x :% dy :% d”,x,y);qmessagebox 3363603360 about(this, t signal ,s); voidtsignalapp 33603360 slot filenew()/发射信号my signal()emiit my signal();/发射信号my signal(int)emittmysignal(5);/发射信号mySignalParam(5,100) emittmysignalparam (5,100);、信号和插槽机制比较灵活,但是有些限制我们需要理解,以避免实际使用中执行的一些向量、一些错误:信号和插槽的效率,但是与实际回调函数相比,灵活性更高,表明速度仍然有些损失;当然,这种损失是比较小的,但如果我们追求效率;例如,实时系统应尽可能少地使用此机制。请注意,信号和插槽机制与常规函数调用一样,如果使用不当,程序运行时可能会发生死循环。因此,定义槽函数时要注意不要间接形成无限循环。也就是说,从插槽接收到的相同信号将再次发射。防止死亡循环形成。如果一个信号与多个插槽相关联,则发送该信号时相关联插槽的活动顺序是随机的。宏定义不能用于signal和slot中的参数。Moc工具不扩展#define,因此从signals和slots中携带参数的宏在没有参数的情况下无法正常工作。构造函数不能在signals或slots声明区域中使用。实际上,不能理解将构造函数放在signals或slots区域中,也不能将其放在privateslots、protectedslots或publicslots区域中。函数指针不能用作信号或插槽的参数。信号和插槽不能有默认参数。由于信号槽绑定发生在运行时,因此概念上很难使用默认参数。信号和插槽也不能携带模板类参数。将信号、插槽声明为模板类参数时,即使MOC工具没有报告错误,也无法获得预期的结果。

温馨提示

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

评论

0/150

提交评论