- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《关于Qt中信号槽机制
关于Qt中信号槽机制?Qt用预编译器和宏来保证强大的跨平台能力,信号机制则是其中最精妙之处。本文分析了几种常见的信号处理机制,然后详细介绍了Qt的Signal/Slot机制。?首 先要说明,这里所说的信号不是Unix中进程间通信的信号。这里的信号更多地与图形界面的输入输出联系在一起(当然也可以是不可见的操作)。自从计算机程 序从字符界面转为图形界面,用户的输入一下子变得繁杂和丰富起来,不同的输入位置、不同的输入设备、不同的焦点位置、不同的输入值组合起来构成了许许多多 的信号。一下子,这个世界变得五彩缤纷。当前的三大主流操作系统??Windows、Unix和MAC都提供了令人赏心悦目的图形界面。虽然它们出自不同 公司,自身还有很多分支,但是在图形操作与管理上还是大致类同的:都有桌面、有图标,有大大小小规则或不规则的窗口,窗口上有标题、边框、菜单以及按钮等 各种控件,用户可以用键盘在当前焦点输入内容,可以用鼠标点击任意的窗口和控件。就能动性来说,是由用户主导程序下一步作何操作,而不象字符时代那样由程 序来主导用户。这也就是所谓的“事件驱动”。在一个事件驱动的系统中,不论是Windows,还是Unix,都脱离不了以下的处理框架:?当某 个应用程序收到操作系统发送的事件时,它就要判断这个事件该由谁处理。处理过程本身又可能引起新的事件发生,这就要告诉操作系统我发出了什么信号。如此这 般循环往复,青山之水常流。那么,一个具体的信号究竟是如何触发与它对应的函数呢?绝大部分的系统都是采用了回调的机制,所谓“回调”其实就是指向某一个 函数的指针。在C语言中函数名其实也是一个指针,因此回调其实是一个指向指针的指针。在不同的开发框架或开发包中,对于回调的实现有着一些细微的差别。初 接触Qt时,我一直在想它是如何处理各种平台的信号调用。虽然C语言本身是平台无关的,但具体到某一个操作系统、某一个开发包,信号机制会有些不同。而信 号是面向对象的开发环境中一个很重要的环节,如果要设计一个类库或程序框架,就必须很好地考虑不同平台间的差异。接触了Qt之后,感觉Qt选择了一条颇具 特色的处理途径??Signals/Slot,中文名暂定为“信号/反应槽”。在Qt的内部设计中,通过信号/反应槽(signals/slot)的使用 对回调进行了很好的封装。为了更好地了解该机制我们先看一下其他几种常用的信号相关程序。1.Win32?Win32的程序总是从 WinMain开始执行。在WinMain的代码中,主要功能一般有三个:一是注册窗口类,二是在屏幕上显示窗口,三是实现消息环。消息环的作用就是从应 用程序队列中取出操作系统放入的消息,从而实现用户和程序之间的交互(也包括象定时器之类的非用户输入的消息)。应用程序不定期地在消息环中等待消息的到 来。如下所示:// 消息环while(GetMessage(msg, NULL, 0, 0)){TranslateMessage(msg);DispatchMessage(msg);}这一段程序包括了形成一个标准消息环的三个基本API:GetM essage()、TranslateMessage()和ispatchMessage(), 采用加速键和非模式对话框时将相应改变消息环的结构。在Windows中,GetMessage()是多任务的核心。在应用程序的消息队列中出现一条消息 之前,该函数并不返回任何东西。GetMessage()的等待阻塞了当前进程,因而为正在运行的其他应用程序提供了检查私有消息环的机会。出现一条消息 后,GetMessage()将取出该消息,并将信息存储在一个MSG数据结构中。对于每一条迫使退出消息环、进程终止的消息(WM_QUIT除 外),GetMessage()返回TRUE。通常在消息环后面跟一个返回语句,迫使WinMain()返回系统。紧跟着GetMessage()的 TranslateMessage()对msg进行处理并修改该数据块的内容。DispatchMessage()负责查找应调用哪一个窗口过程,这种选 择是根据msg中hwnd所标识的窗口进行决策。窗口过程对消息进行处理, 完毕后即返回到消息环, 再次执行GetMessage()。如下图所示:?为 了对所关心的消息做出处理,窗口在创建时一定要提供一个消息回调函数,不管该创建过程是显式调用还是其他API函数隐式生成。用户在该回调函数中要对每一 个关心的消息做出判断与处理,从C语言的观点来看,一个窗口过程(回调函数)就是这样一个函数:接受四个参数,返回一个LRESULT值,一个 switch语句在过程内占用了大量的代码以完成各个行为动作。2.MFC?虽然直接用Win32 API开发的程序运行效率高、条理分明,但开发起来却较为复杂,维护工时也耗用较多,因
文档评论(0)