全部博文(2759)
分类: C/C++
2013-08-20 11:05:40
原文地址:Qt-初学者-信号与槽(signals and slots) 作者:一鸣雨
信号与槽是一种Qt特有的对象间通信的机制,是Qt区别于其他图形系统的基本特征。信号与槽之间是一种松散的连接关系,这种连接关系可以在程序运行时动态改变,这为Qt编程提供了极大的灵活性。
定义信号使用Qt的signals关键字。注意信号没有访问权限,实际上它们都是受保护权限的,也就是说只有定义信号的类自己及派生类才能发射这个信号。信号一般定义为无返回值的函数,这个函数不需要实现(由moc工具自动生成的代码实现)。
定义槽使用Qt的slots关键字。槽同时也是一个普通函数,可以有各种访问权限。
发射信号使用Qt的emit关键字。信号发射后,与这个信号链接的槽就会被调用。
连接信号和槽可以使用QObject类的以下静态成员函数:
例如 :
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection);
对应的成员参数的内部关系:
1)sender:指向Qt对像,信号的发送者。
2)signal:表示信号的字符串。
3)receiver:指向Qt对象,信号的接受者。
4)method:表示与信号连接的方式的字符串,这里的方法可以是槽或信号。
5)type:表示连接方式。
6)返回值:true表示连接成功,false表示连接失败。
同时信号与槽有以下几种连接方式:
1)Qt::DirectConnection:直接方式,信号发射时将直接调用槽。
2)Qt::QueuedConnection:队列方式,信号发射时产生一个事件进入队列,事件被处理时槽才能调用。
3)Qt::BlockQueuedConnection:阻塞队列方式,信号发射时产生一个事件进入队列,然后当前线程进入等待状态,直到事件处理完毕,仅用于多线程的情况。
4)Qt::AutoConnection:自动方式,由系统自动选择连接方式。
一般来说都采用默认的自动连接进行连接。因为支持信号和槽的类都是QObject的派生类,因此如果在成员函数中进行连接可以不写QObject::这样的限定符。
用来表示信号和槽的参数都是字符串,Qt提供了两个宏用于构造这样的字符串:对于信号使用SIGNAL,对于槽则使用SLOT,用它们将函数的原型包围起来即可。注意这里的函数原型只能写出类型,不能有任何参数名,否则连接时将会失败。
信号和槽的连接有以下特点:
1)一个信号可以连接到多个槽。
2)一个槽可以被多个信号连接。
3)信号也可以连接到信号,此时前者的发射信号将导致后者的发射。
4)信号的参数类型可以与槽的参数类型对应,信号的参数可以比槽的参数多,但不可以少,否则连接将失败。
注意:定义信号与槽时最好不要有自定义类型的参数,否则它只能与特定参数类型的信号或槽连接,可用性大大降低。
已经建立的连接关系也可以被断开,用QObject类的以下静态成员函数.
常用的Qt对象类中已经定义了很多有用的信号和槽,编程时可以直接调用。
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method);
这里各个参数及返回值的含义与connect函数相同。需要注意的是,除了参数sender,其他参数都可以是0,代表“所有”。