Qt信号槽机制初探
时间:2011-04-16 来源:seansevn
class Counter { public: Counter() { m_value = 0; } int value() const { return m_value; } void setValue(int value); private: int m_value; };A small QObject-based class might read: #include <QObject> class Counter : public QObject { Q_OBJECT public: Counter() { m_value = 0; } int value() const { return m_value; } public slots: void setValue(int value); signals: void valueChanged(int newValue); private: int m_value; };信号和槽
信号和槽用于对象之间的通信。信号槽机制是Qt的核心特性,并且很大程度上是区别去其他区别于其他框架提供的特性。
简介:
在GUI编程中,当一个widget改变,我们经常希望另外的widget被告知。更普遍地,我们希望任何的对象都可以互相通信。比如,如果用户点击close按钮,我们大多希望调用窗口的close()方法。
以前的工具集通过callback来实现这种通信。callback是指向函数的指针,因此,若果你想让处理函数通知你某些事件,你可以传递给另一个函数一个指针来处理函数。处理函数
在适当的时候调用callback。Callbacks有两种根本的缺陷:第一,它们不是类型安全的,我们无法确定处理程序会调用正确参数的回调函数(callback)。第二,回调函数耦合于处理函数,因为处理函数必须知道去调用哪个回调函数。
信号和槽:
Qt提供了回调的替代技术:我们使用信号和槽。当特定事件发生时发出信号。Qt的widget有许多预定义的信号,但是我们可以为widget子类添加我们自定义的信号。槽是回应特定的信号时所调用的方法。Qt的窗口部件有许多预定义的槽,但是我们也可以为窗口部件的子类田间我们自定义的槽,以处理我们感兴趣的信号。
信号槽机制是类型安全的:信号的签名必须跟接受的槽的签名相匹配(事实上,槽的签名可以比信号的签名短,因为它可以忽略额外的字段)。因为签名是相容的,编译器就可以帮我们检测类型的不匹配。信号和槽是松耦合的:一个类产生一个信号,并不知道而且不关心那个槽接受该信号。Qt的信号槽机制保证,如果你连接了一对信号槽,槽会在适当的时间带着信号的参数被调用。信号和槽可以附带任何类型任何数量的参数。信号和槽是完全类型安全的。
所有的从QObject类继承的类或者说它的子类(比如,QWidget)可以包含信号槽。当对象改变状态的时候,可以以其他对象可能感兴趣的方式产生信号。这就是所有的对象通信的方式。它不知道也不关心时候有对象接受它产生的信号。这是真正的信息封装,保证对象可以用作软件的组成部分。
槽可以用来接受信号,不过槽也是普通的成员函数。类似于对象不知道谁接受它的信号,槽也不知道是否有信号连接自己。这保证了Qt可以创建完全独立的组件。
一个信号可以连接无数的槽,并且一个槽可以连接你想要连接的信号。甚至可以直接连接两个信号(当第一个信号产生,立即产生第二个信号)。
信号和槽一起形成了一种强大的组件编程机制。