Qt信号与槽

      信号与槽是一种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类的以下静态成员函数:

bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method);

       这里各个参数及返回值的含义与connect函数相同。需要注意的是,除了参数sender,其他参数都可以是0,代表“所有”。


       常用的Qt对象类中已经定义了很多有用的信号和槽,编程时可以直接调用。

你可能感兴趣的:(多线程,编程,qt,工具,图形,Signal)