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