信号(signal)与槽(slot)就像插头与插座,有些不同的是,信号可以连接多个槽,槽也可以被多个信号连接。
Qt中的信号形式上像是一个函数,不需要具体实现,槽也是一个函数,需要书写内部的执行代码。信号一触发,所连接的槽函数就执行。
它们之间用语句connect连接:
当前Qt5版本有传统的信号槽与新推出的两种,使用形式分别如下:
QObject::connect(sender, SIGNAL(signalName(T)), receiver, SLOT(slotFunction(T)));
QObject::connect(&sender, &sender::sinal,&receiver, &receiver::slotFunction);
QObject部分可省略,它也表明connect 像是QObject的一个函数。不是QObject就不能使用信号槽。
SIGNAL与SLOT是传说中的宏了,本篇倾向于初学者,不讨论。记住两种形式。
新推出的方法中,&表示引用。在连接信号槽之前,对象要已经存在。
用汉语表示的形式:传统形式:QObject::connect(信号发送者,SIGNAL(信号名(参数1,参数2))),信号接收者,SLOT(槽函数(参数1,参数2));
新式形式,省略了两个宏。而且参数部分不需要写了。信自动一一对应传递。
查看下面两个类的声明代码:
#include <QObject>
class Sender : public QObject
{
Q_OBJECT
public:
Counter();
signals:
void valueChanged(int Value);
};
#include <QObject>
class Receiver: public QObject
{
Q_OBJECT
public:
Counter();
public slots:
void setValue(int value);
};
要使用信号槽机制,必需让你定义的类继承自QObject或它的子类,而且需要在声明最顶部放上Q_OBJECT宏。就像上面那样。
那connect放在哪?一般在函数的构造函数中使用它,类一初始化完成,信号槽就连接好。当然也可以临时连接。
使用如下:
Sender a;
Receiver b;
QObject::connect(&a, &Sender ::valueChanged,
&b, &Receiver ::setValue);
//connect(a, SIGNAL(valueChanged(int)), b, SLOT(setValue(int)));