信号与槽

来源:互联网 发布:桌面高考倒计时软件 编辑:程序博客网 时间:2024/05/22 20:37

信号与槽机制是Qt编程的基础。它使得应用程序开发人员可以将对象绑定到一起而对象之间不需要相互了解。

槽几乎与普通的C++成员函数相同。它们可以是虚函数。它们可以被重载。它们可以是公有的,可以是保护类型的,也可以是私有类型的,它们可以像其他类成员函数一样调用。它们的参数也可以是任何类型。不同之处就是它可以连接到一个信号上,每当信号发出时,它自动地被调用。

connect()语句的使用方式如下所示:

connect(sender,SIGNAL(signal), receiver, SLOT(slot));

信号与槽的连接可以有多种组合方式,如下所示:

  • 一个信号可连接到许多槽中。

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(calculator,SIGNAL(divisionByZero()),

this,SLOT(handleMathError()));

  • 一个信号可以连接到另外一个信号中。

connect(lineEdit,SIGNAL(textChanged(const QString &)),

this,SIGNAL(updateRecord(const QString &)));

  • 信号与槽之间的连接可以被解除。

disconnect(lcd,SIGNAL(overflow()),

this,SLOT(handleMathError()));

另外,一般情况下,连接在一起的信号与槽的参数类型和参数顺序应该相同,特别地,信号的参数个数可以比连接到此信号中的槽的参数个数多,多余的参数个数会被忽略。

信号与槽的实质

信号与槽实质是用函数指针实现的。当使用emit发送一个信号时,实际上是调用该号。信号是一个函数,其实现代码由moc生成。该函数调用任何与之相连的槽,这些槽的信息是通过拥有槽的对象的元对象获得的。

元对象包含了指向槽的函数指针,以及它们的名字和参数类型。它们同时包含一个可用的信号和信号名字以及参数类型的一个列表。当调用connect时,实际上是通过元对象将槽加入到信号的调用列表中。如果参数匹配,连接就建立起来了。

在匹配参数时,仅检查槽所能接受的参数。这意味着,一个无参数的槽可以与所有的信号匹配。