Qt 信号和槽
Qt 信号和槽
信号和槽是Qt中对象进行通讯的机制。该机制是观察者模式的一种实现,类似于回调函数,当一个对象的状态发生改变时,会触发本对象或者其他对象的一些行为。
与回调函数对比:
什么是信号和槽?
有一个简短的答案和一个详细的答案。我们会叙述这个详细的答案,但是对于不想等太多时间的读者,请看一下简短的答案
简单答案:它们是啥
信号和槽是观察者模式的一种通用实现。信号是可观察的事件,或者至少是发生事件的通知。槽是一个潜在的观察者,典型的槽是一个被调用的函数。通过connect函数建立这种可观察对象-观察者的联系。当一些事件发生或者对象的状态改变,就会触发信号。释放信号的对象要调用所有注册到这个信号上的函数(槽)。
信号和槽是多对多的关系。一个信号可以连接到任意数量的槽上。多个信号可以连接到同一个槽上。
信号可以携带额外的信息,例如,当窗口关闭的时候会发出一个信号,这个信号会携带对窗口的引用信息。把信号和槽看到是函数原型是很有用的。一个信号可连接到任何可以兼容函数原型的槽上。
对于信号和槽,有多种不同的实现,它们在架构的风格和接口及基础设计选择上是不同的。
详细答案:它们是怎么来的
上面的答案,给出了一些关于信号和槽的说明,但是我想更想说明信号和槽是如何来的,并且如何使用它们。
编程中一个基本的概念就是通讯,一个对象通知另一个对象去做某事,从简入繁,来讲一下
一个简单的引入例子:重新载入网页的按钮
class Button
{
public:
void clicked();
// 按钮会被按下
};
class Page
{
public:
void reload();
// ...which I might want to do when a Button is clicked
};
换句话说,Page对象知道如何重新载入,Button对象有时会被点击。我们我们有一个获取当前页面的函数currentPage(),可能点击这个按钮就会要求当前页面重新载入
void Button::clicked()
{
currentPage()->reload();
// Buttons know exactly what to do when clicked
}