1.信号:
当某个信号对其所有者发生的内部状态发生改变,信号就由该对象发射 (emit) 出去。只有 定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。信号 - 槽机制完全独立于任何 GUI 事件循环。只有当所有的槽返回以后发射函数(emit)才返回。 如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。
信号的声明一般在头文件中,格式如下:
signals:
void mySignal();
void mySignal(int x);
void mySignalParam(int x,int y);
2.槽:
槽是普通的 C++ 成员函数,可以被正常调用。多个信号可以与一个槽相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。既然槽是普通的成员函数,因此与其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的 C++ 成员函数一样,槽函数也分为三种类型,即 public slots、private slots 和 protected slots。
public slots:所有对象都可以将信号与其相关联;
protected slots:仅当前类和当前类的子类的对象可以把信号与这个槽相关联;
private slots:只有本类的对象可以把信号和这个槽相联。
槽的声明也一般在头文件里,格式如下:
public slots:
void mySlot();
void mySlot(int x);
void mySignalParam(int x,int y);
3.信号与槽的关联:
通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:
bool QObject::connect ( const QObject * sender, const char * signal,
const QObject * receiver, const char * member )
这个函数的作用就是将发射者 sender 对象中的信号 signal 与接收者 receiver 中的 member 槽函数联系起来。当指定信号 signal 时必须使用 QT 的宏 SIGNAL(),当指定槽函数时必须使用宏 SLOT()。如果发射者与接收者属于同一个对象的话,那么在 connect 调用中接收者参数可以省略。
下面的例子就是把标签对象 label 和滚动条对象 scroll相关联,这样标签总是显示滚动条所处位置的值。
QLabel *label = new QLabel;
QScrollBar *scroll = new QScrollBar;
QObject::connect( scroll, SIGNAL(valueChanged(int)), label,SLOT(setNum(int)) );
4.断开关联:
当信号与槽没有必要继续保持关联时,我们可以使用 disconnect 函数来断开连接。其定义如下:
bool QObject::disconnect ( const QObject * sender, const char * signal,
const Object * receiver, const char * member ) [static]
主要有以下3种情况:
(1)断开与某个对象相关联的所有对象
disconnect( myObject, 0, 0, 0 )
/*或者*/
myObject->disconnect()
(2)断开与某个特定信号的关联
disconnect( myObject, SIGNAL(mySignal()), 0, 0 )
/*或者*/
myObject->disconnect( SIGNAL(mySignal()) )
(3)断开与2个对象之间的关联
disconnect( myObject, 0, myReceiver, 0 )
/*或者*/
myObject->disconnect( myReceiver )