Qt提供signals and slots mechanism(信号槽机制)来保证两个对象之前的关联(connection)。
所谓信号槽,简单理解就是两部分,一个是某对象发出的信号,一个是某对象接收该信号的槽。而信号和槽其实就是一个个函数。某一个组件发出了一个信号,另一个组件接收到这个信号,执行相应的函数调用。有点像if语句:
if(//emit signal)
{
//slot function is invoked
}
else
{
}
但是Qt::的信号槽机制允许我们将两个毫无关系的对象进行关联。说的更离奇点,发出信号的对象根本就不需要知道有没有对象会接收这个信号,当然就更不会知道是谁接收这个信号。而接收信号的槽对象也根本就不知道它接收的这个信号是谁发出的。信号和槽之间的通讯,是Qt帮助我们完成的,我们要做的,只是使用connect函数显示地关联一下信号和槽,告诉编译器”给我盯着点这个信号,如果它被发出了,赶紧去调用槽函数“。
举个例子,当点击搜索按钮,那么搜索按钮(button)的被点击(clicked())信号就会发出,与之关联的槽函数将会被执行,我们猜这个槽函数应该首先会读取输入框中的字符串("connect"),然后通过某种查找算法将结果显示到文本框中,随后看到了搜索结果。
connect函数有五个重载,比较常见的形式为:
connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection );
其中sender和receiver是两个对象(Object)指针,signal和method分别是他们的成员函数。Qt中可以使用SIGNAL()和SLOT()将函数转换成const char*的形式。
举个例子:假设MyButton是一个button按钮类,它有一个信号clicked(),表示 一旦这个按钮被点击,相应的信号就会发出。还有一个Close类,它有一个exit()函数,可以关闭整个窗口。sender是MyButton类的指针,receiver是Close类的指针。
我们想要实现一旦用户点击button,窗口就会关闭,那么就需要关联这两个类,就像这样:
connect(sender, SIGNAL(clicked()), receiver, SLOT(exit());
或者
connect(sender, &MyButton::clicked, receiver, &Close::exit);
就可以达到目的。