网站大量收购闲置独家精品文档,联系QQ:2885784924

Qt信号与槽机制Qt信号与槽机制.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Qt信号与槽机制Qt信号与槽机制

{Qt信号与槽} 信号与槽机制 概述 在GUI用户界面中,当用户操作一个窗口部件时,需要其他窗口部件的响应或者能够激活其他的操作。在程序开发中,经常使用回调(callback)机制来实现。所谓回调,就是事先将一个回调函数(callback funcation)指针传递给某一个处理过程,当这个处理过程得到执行时,回调预先定义好的回调函数以期实现激活其他处理过程的目的。 不同与回调函数机制,Qt提供了信号与槽机制。信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。 当某个对象的状态发生变化时,该对象会触发一个信号。这信号与另外一些对象的槽函数绑定,信号的触发将导致执行这些槽函数,这些槽函数进行对象状态变化的特殊处理,从而完成对象之间的通信。 本节将阐述Qt为什么使用信号与槽机制而不是传统的回调函数机制进行对象间的通信,信号与槽的具体的分析,和如何定义信号与槽及其绑定。 动机 给定一个类,它和其他类有两种交互方式:(1)在该类的设计阶段即可确定和哪个类交互。这种情况下,我们只需要简单地调用目标类的成员函数,即可完成交互。(2)在该类的设计阶段无法确定和哪个类交互。下图1-1为Qt Creator高级查找功能对话框。用户在“查找”之后的行编辑框输入一个带搜索的字符串,在该编辑框下面的几个选择框指定搜索条件。用户按“搜索”按钮后,Qt Creator在用户正编辑的文档中搜索指定的字符串。只有当编辑框中的内容不为空时,“搜索”按钮才被使能,否则,该按钮被禁用。 图1-1 Qt Creator高级查找功能对话框 Qt使用类QLineEdit实现图中编辑框的功能。假如我们是该类的设计者,我们必须解决一个问题:虽然在这个具体例子中,我们确切地知道是“搜索”按钮关注编辑框的内容是否为空,但是在QLineEdit的设计阶段,我们根本无法预测哪些类将会关注编辑框的数据状态。因此,当编辑框的状态在“空”和“不空”之间切换时,我们不知道将这种状态变化通知给哪个对象。 一种可能的做法是使用回调函数(callback function)。在设计QLineEdit时,我们令其存放一个函数指针。使用该类时,我们令该指针指向一个处理上述状态变化的函数,该函数被称为回调函数。在该例子中,我们应该令其指针指向“搜索”按钮的某个成员函数。当QLineEdit的状态发生变化时,这个成员函数会被执行,完成QLineEdit对象和“搜索”按钮对象之间的交互。 这种做法不灵活。如果有多个类都在关注某个类的状态变化,存放一个回调函数的信息显然无法满足要求,此时需要维护一张表,存放多个回调函数的地址。对于每一个被关注的类都需要做类似的工作,因而这种做法效率低、不灵活。 Qt使用信号与槽机制来解决这个问题。假设类A的状态发生变化时,需要通知对象B,以执行类B的成员函数slot()来处理这种状态的变化。 所谓信号,就是类A定义的一个成员函数,比如signal(),当A的状态发生变化时,对象A将状态信息封装在该函数的参数中,调用该函数。 所谓槽,也是类B的一个成员函数,比如上述的slot()。 通过Qt提供的QObject::connect()函数,可以将一个信号函数与槽函数绑定,当信号函数被调用时,与其绑定的槽函数就会被调用。 这种处理方式高效、灵活。Qt有一套专门的机制来处理信号与槽,开发人员在软件设计阶段只需要指定一个类含有哪些信号函数、哪些槽函数,Qt会来处理信号函数和槽函数之间的绑定。当信号函数被调用时,Qt会找到并执行与其绑定的槽函数。而且,Qt与允许一个信号和多个槽函数绑定,Qt会找到并执行一个信号绑定的所有槽函数。 一个简单的例子 在深入讨论信号与槽之前,我们先给一个尽可能简单的例子,使读者对这个机制有一个直观的印象。 class CExampleA : public QObject { Q_OBJECT public: CExampleA() { m_Value = 0; } void SetValue(int nNewVal) { if(m_Value == nNewVal) { return ; } m_Value = nNewVal; emit stateChanged(m_Value); ① } signals:

文档评论(0)

cduutang + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档