QT中connect连接信号signals和槽slots机制

1.信号:

当某个信号对其所有者发生的内部状态发生改变,信号就由该对象发射 (emit) 出去。只有 定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。信号 - 槽机制完全独立于任何 GUI 事件循环。只有当所有的槽返回以后发射函数(emit)才返回。 如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。

信号的声明一般在头文件中,格式如下:
signals: 
         void mySignal(); 
         void mySignal(int x); 
         void mySignalParam(int x,int y);

2.槽:

槽是普通的 C++ 成员函数,可以被正常调用。多个信号可以与一个槽相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。既然槽是普通的成员函数,因此与其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的 C++ 成员函数一样,槽函数也分为三种类型,即 public slots、private slots 和 protected slots。
public slots:所有对象都可以将信号与其相关联;
protected slots:仅当前类和当前类的子类的对象可以把信号与这个槽相关联;
private slots:只有本类的对象可以把信号和这个槽相联。

槽的声明也一般在头文件里,格式如下:

public slots: 
         void mySlot(); 
         void mySlot(int x); 
         void mySignalParam(int x,int y);

3.信号与槽的关联:

通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:

 bool QObject::connect ( const QObject * sender, const char * signal, 
         const QObject * receiver, const char * member ) 

这个函数的作用就是将发射者 sender 对象中的信号 signal 与接收者 receiver 中的 member 槽函数联系起来。当指定信号 signal 时必须使用 QT 的宏 SIGNAL(),当指定槽函数时必须使用宏 SLOT()。如果发射者与接收者属于同一个对象的话,那么在 connect 调用中接收者参数可以省略。

下面的例子就是把标签对象 label 和滚动条对象 scroll相关联,这样标签总是显示滚动条所处位置的值。

 QLabel     *label  = new QLabel; 
 QScrollBar *scroll = new QScrollBar; 
 QObject::connect( scroll, SIGNAL(valueChanged(int)), label,SLOT(setNum(int)) );

4.断开关联:
当信号与槽没有必要继续保持关联时,我们可以使用 disconnect 函数来断开连接。其定义如下:

 bool QObject::disconnect ( const QObject * sender, const char * signal, 
         const Object * receiver, const char * member ) [static]

主要有以下3种情况:
(1)断开与某个对象相关联的所有对象

disconnect( myObject, 0, 0, 0 ) 
/*或者*/
 myObject->disconnect()

(2)断开与某个特定信号的关联

disconnect( myObject, SIGNAL(mySignal()), 0, 0 ) 
/*或者*/
 myObject->disconnect( SIGNAL(mySignal()) )

(3)断开与2个对象之间的关联

disconnect( myObject, 0, myReceiver, 0 ) 
/*或者*/
 myObject->disconnect(  myReceiver )
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值