Chinaunix首页 | 论坛 | 博客
  • 博客访问: 497633
  • 博文数量: 74
  • 博客积分: 750
  • 博客等级: 军士长
  • 技术积分: 1453
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-29 15:59
文章分类
文章存档

2014年(30)

2013年(8)

2012年(36)

分类: C/C++

2013-08-19 08:39:07

    信号与槽是一种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对象类中已经定义了很多有用的信号和槽,编程时可以直接调用。








阅读(7491) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~