信号和槽机制是QT编程的基础,可以程序员把互不了解的对象绑定在一起。
槽和普通的C++成员函数几乎是一样的,,但唯一的不用是:槽还可以跟信号连接在一起。每当发射信号就会自动调用这个槽。
connect的语句看起来这样的:
connect(sender,SIGNAL(signal)),receiver,SLOT(slot));
sender , receive是指向QObject的指针,signal 和 slot 是不带参数名(书上是参数,我认识说是参数名更确切)的函数名,实际上SIGNL()和SLOT()宏会把它们的参数转化成相应的字符串。
除了一个信号连接一个槽,还可以有其他的可能性
1.一个信号连接多个槽 发射这个信号的时候,以不确定顺序一个接一个调用这些槽
2.多个信号连接同一个槽, 无论哪个信号都可以调用槽
3.一个信号和另外一个信号连接, 发射第一个信号也会发射第二个信号, 它们的连接和信号和槽的连接难以区别
4.连接可以被移除
diconnect
但这种情况较少用到。因为删除对象的时候QT自动移除和这个对象相关的所有连接
要是信号和槽成功连接,他们的参数必须具有相同的顺序和相同的类型,
一个例外,信号的参数多于槽的参数,多余的参数被忽略
参数类型不匹配,或者信号或者槽不存在,或者信号和槽包含参数名 都会发出警告
我起先没有注意到的一点是·:
槽也可以发射自己的信号。通过关键字 emit 貌似上次漏掉了
另外这种机制不局限于图形用户界面变成,可以用于任何QObject的子类中:
比如下面:
class employee:public QObject{
Q_OBJECT
public:
employ(){mysalary=0;}
public slots:
void setsalary(int newsalary);
signal:
void salarychanged(int newsalary);
private:
int mysalary;
};
void employee::setsalary(int newsalary){
if(newsalary!=mysalary){
mysalary=newsalary;
emit salarychanged(mysalary);
}
}
setsalary()槽可发射salarychanged()信号。
下面放一张我们已经用到过的类的关系图