1.槽和普通的C++成员函数差不多——虚函数|重载|public|private|被其他函数调用|参数是任意的。
唯一的不同:槽可以和信号连接在一起
connect(sender,SIGNAL(signal),receiver,SLOT(slot));
//sender;receive是指向QObject的。
1)一个信号可以连接多个槽
connect(slider,SIGNAL(valueChanged(int)),spinBox,SLOT(setValue(int));
connect(slider,SIGNAL(valueChanged(int)),this,SLOT(updateStatusBarIndicator(int)));
//在发射这个信号的时候,会以不确定顺序一个接一个的调用这些槽
- 多个信号可以连接同一个槽
connect(lcd,SIGNAL(overflow()),this,SLOT(handleMathError()));
connect(calcluator,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()));
这种情况用到很少
///////////////////////////////////////////////////////////////////////////////////////////////////////////
2.要把信号成功连到槽(或者另一个信号),它们的参数必须具有相同的顺序和相同的类型。
connect(ftp,SIGNAL(rawCommandReply(int,const QString&)),this,SLOT(processReply(int,const QString &)));
列外--如果信号的参数比槽多,多余的参数会被忽略
connect(ftp,SIGNAL(rawCmmandReply(int,const QString&)),this,SLOT(checkErrorCode(int)));
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
我们仅仅在窗口部件之间使用了信号和槽。但是这种机制本身是在QObject中实现的,并不只局限于图形用户界面编程中。这种机制可以用于任何QObject的子类中:
class Employee:public QObject
{
Q_OBJECT
public:
Employee(){mySalary = 0;}
int salary()const {return mySalary;}
public slots:
void setSalary(int newSalary);
signals:
void salaryChanged(int newSalary);
private:
int mySalary;
};
void Employee::setSalary(int newSalary)
{
if(newSalary != mySalary){
mySalary = newSalary;
emit salaryChanged(mySalary);
}
}
网友评论