Qt采用 一种全新的对象和方法的关联与通信机制,称为信号和槽机制。信号和槽机制是独立于标准c++编译器的,在编译之前需要经过Qt的专门预处理工具MOC( Meta Object Compiler ,元组件编译器)对代码进行预处理后才能进一步进行c++代码的编译。MOC会将Qt应用程序中特有的代码自动转化为相应的标准c++语法代码。
Qt引入信号和槽机制来取代回调函数。凡是继承自QObject的类都可以具有信号和槽成员,并可以使用它们。信号和槽都采用函数作为存在形式。在Qt程序初始化或运行的过程中,可以静态或动态地将信号和槽相关联。当某一事件到来时,会发射信号,但是发射后,它并不需要关心信号的处理者是谁。当触发槽函数时,说明与其相关联的信号被接收,但它不需要了解谁发出了信号,它只需要负责进行相应的处理即可。
1、信号
信号是Qt对事件的一种抽象,当一个事件到来时,会发射信号。所谓发射信号,就是通过Qt中特有的通信机制,调用和信号相关联的各个槽函数。因此当发射信号时,将执行与其相关联的槽函数。信号函数在形式上与标准c++中的虚函数类似,信号函数只有头文件中函数的声明,而没有函数的定义。信号的声明形式如下:
signal:
void MySignal();
void MySignal( int x );
void MySignalParam( int x, int y );
2、槽
槽是Qt中负责信号处理的实体,当有信号发射时,与信号关联的所有槽会一次执行。槽的声明如下:
public slot :
void MySlot();
void MySlot( int x );
void MySlot( int x, int y );
槽函数的使用和标准c++函数的使用方式相同,在代码中直接调用。槽函数具有访问权限的标识,他们同c++类成员函数的标识相同,分别为:public、protected、private。public说明该槽函数可以被其他类的信号所关联,protected 说明只能被类本身和其子类的信号所关联,private 说明该槽函数只能被类本身的信号所关联。
在Qt的基类QObject 中有一个成员函数用来完成信号和槽的映射,函数的原型如下:
#include<QObject>
static bool QObject :: connect( const QObject* sender, const char* signal, const QObject* receiver, const char* member );
其中,sender和receiver分别指定了被关联的信号和槽的发送者和接收者。signal 是信号,Qt要求必须使用宏 SIGNAL 将信号函数指针转化为指定类型。member是槽,Qt要求必须使用宏SLOT转化函数指针。宏SIGNAL和SLOT 的参数形式如下:
SIGNAL( funname( param_type_1, param_type_2, .... ) )
SLOT( funname( param_type_1, param_type_2, .... ) )
其中,funname是函数名,param_type_x是函数中对应参数的类型