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