2.2 深入介绍信号和槽
槽和普通的C++成员函数几乎是一样的一一可以是虚函数;可以被重载;可以是公有的、保护的或者私有的,并且也可以被其他C++成员函数直接调用;还有,它们的参数可以是任意类型。唯一的不同是:槽还可以和信号连接在一起,在这种情况下,每当发射这个信号的时候,就会自动调用这个槽。
connect(sender,SIGNAL(signal),receiver,SLOT(slot));
这里的sender发送者和receiver接收者是指向QObject的指针, signal信号和slot槽是不带参数的函数名,实际上,SIGNAL()宏和SLOT()宏会把它们的参数转换成相应的字符串
//1、一个信号可以连接多个槽
connect(slider,SIGNAL(valueChanged(int)),spinBox,SLOT(setValue(int)));
connect(slider,SIGNAL(valueChanged(int)),this,SLOT(updateStatusBarIndicator(int)));
//在发射这个信号时,会以不确定的顺序一个接一个地调用这些槽。
//2、多个信号可以连接同一个槽
connect(lcd,SIGNAL(overflow),this,SLOT(handleMathError()));
connect(calculator,SIGNAL(divisionByZero()),this,SLOT(handleMathError));
//无论发射的是哪一个信号,都会调用这个槽
//3、一个信号可以与另一个信号相连接
connect(lineEdit,SIGNAL(textChanged(const QString&)),this,SIGNAL(updateRecord(const QString &)));
//当发射第一个信号时,也会发射第二个信号
//4、连接可以被移除
disconnect(lcd,SIGNAL(overflow),this,SLOT(handleMathError));
//这种情况较少用到,一般删除对象时,Qt会自动移除和这个对象相关的所有连接
//5、信号和槽的连接需要它们的参数必须具有相同的顺序和相同的类型
connect(ftp,SIGNAL(rawCommandReply(int,const QString &)),this,SLOT(processReply(int,const QString &)));
//6、如果信号的参数比连接的槽的参数多,那么多余的参数将会被简单地忽略掉
connect(ftp,SIGNAL(rawCommandReply(int, const QString &)),this,SLOT(checkErrorCode(int)));
//如果参数类型不匹配,或者如果信号或槽不存在,或者信号和槽的名字中包含了参数名,则会在运行时发生警告。
//信号和槽的机制适用于任何QObject的子类中,如果没有继承于QObject的类则不能使用。