学习笔记之qt4的信号与槽机制

      信号是一个特定的标识;一个槽就是一个函数,与一般的函数不同,槽函数既能够和信号关联,也能够像普通函数一样直接调用。
      当某个事件出现时,通过发送信号,可以将与之相关联的槽函数激活,即执行槽函数代码。在程序中,使用QObject::connect()函数来讲某个信号和某个槽进行关联,而信号和槽之间的真正关联是由Qt的信号和槽机制来实现的。


      信号和槽的关联关系可以有3种模式:
-〉一个信号和一个槽关联;
-〉一个信号和多个槽关联;
-〉多个信号和一个槽关联;
   一个信号和多个槽关联的情况下,当发出该信号的时候,与该信号关联的各个槽以任意的先后顺序立即执行。信号和槽机制是完全独立于GUI事件循环的。
      此外,信号还可以与信号进行关联。当两个信号关联时,第一个信号的发出将会激Qt发出第二个信号。
      信号和槽机制通过QObject::connect(const QObject *sender,const char *signal,const QObject *receiver,const char*method,Qt::ConnectionType type=Qt::AutoCompatConnection)函数关联,参数type定义了信号与槽的关联方式,决定一个信号时立即传递到槽还是排队等待以后传递。


   Qt使用了枚举类型Qt::ConnectionType定义了信号与槽的关联方式,有3种:
-〉Qt::DirectConnection,信号发送后立即传递给相关联的槽,只有槽函数执行完毕返回后,发送信号“emit<信号>”之后代码才被执行。
-〉Qt::QueuedConnection,信号发送后排队,直到事件循环(event loop)有能力将他传递给槽。而不管槽函数有没有执行,发送信号“emit<信号>”之后的代码都会立即得到执行。
-〉Qt::AutoConnection,如果信号和槽在同一个线程,信号发出后,槽函数将立即执行,等同于Qt::DirectConnection;如果信号和槽不在同一个线程,信号将排队,等待事件循环的处理,效果等同于Qt::QueuedConnection。
   
   对于Qt::QueuedConnection方式,Qt元对象系统必须知道信号/槽的参数类型,否则的话编译器会报错“QObject::connect:Cannot queue arguments of type 'Type'”,想要使用类型Type必须首先通过qRegisterMetType()函数在元对象系统中注册(简单数据类型和Qt定义的数据类型无需注册,可直接使用)。


   宏SIGNAL()和SLOT()返回其参数的C风格的字符串(const char *),因此下面关联信号和槽的两个语句是等同的:
connect(pushButton,SIGNAL(clicked()),this,SLOT(doPushButton()));
connect(pushButton,"clicked()",this,"doPushButton()");

Qt信号和槽机制的优点是:类型安全,松散耦合。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值