3.5 使用connect函数实现信号槽绑定


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

3.5 使用connect函数实现信号槽绑定

使用QT开发时,通常使用connect函数只传递四个参数:

connect(Sender,SIGNAL(signal),Receiver,SLOT(slot));


所以我们有可能认为该函数就只有四个参数,但实际上是有第五个参数的,只是通常该函数已经给第五个参数赋值了而已,我们所使用的是默认值。

实际上connect函数应该是如下形式:

connect(sender,SIGNAL(signal),receiver,SLOT(slot),Qt::DirectConnection);


断开连接的方法:

disconnect(sender,SIGNAL(signal),receiver,SLOT(slot),Qt::DirectConnection);


 该方法虽然不是必须使用的,因为当一个对象delete之后,Qt自动取消所有连接到这个对象上面的槽。

但是在项目开发中,在画面上绑定信号的时候,通常会主动解除绑定,在画面的哪个生命周期绑定信号则在其对称的生命周期中解除绑定(例如在onActive中绑定,则在onDeactive中解绑。),这么做的目的一个我为了代码规范,另一个如果该对象距离自动销毁这段时间里边可能会收到信号。

 

1. 最常规的用法:

信号可以是插件自带的,也可以是自己定义的如:

    //新建一个按钮

    QPushButton * btn = new QPushButton(this);

    btn->setText("设置");


    //将信号和槽连接 其中btnclicked()为自定义的槽函数

    connect(btn, SIGNAL(clicked()), this, SLOT(btnclicked()));


 

2. 带参数的信号和槽函数

当信号的参数与槽函数的参数数量不同时,只能是信号的参数数量多于槽函数的参数数量,且前面相同数量的参数类型应一致,信号中多余的参数会被忽略。

//信号:

void mySignal(int a, float b);


//槽:

void Widget::mySlot(int b)

{

//do something!!

}


//信号槽:

connect(this, SIGNAL(mySignal(int, float)), this, SLOT(mySlot(int)));



//发射信号:

emit mySignal(5, 2.2);



3. connect()函数基于函数指针的重载形式:

QMetaObject::Connection QObject::connect(

const QObject *sender, PointerToMemberFunction signal,

const QObject *receiver,PointerToMemberFunction method,

Qt::ConnectionType type = Qt::AutoConnection)


 这是QT5中加入的一种重载形式,指定信号和槽两个参数不再使用SIGNAL()和 SLOT()宏,并且槽函数不再必须是使用slots关键字声明的函数,可以是任意能和信号关联的成员函数。

要使一个成员函数可以和信号关联,那么这个函数的参数数目不能超过信号的参数数目,但是并不要求该函数拥有的参数类型和信号中对应的参数类型完全一致,只需要可以进行隐式转换即可。

所以在qt5中建议使用这种关联形式。


// Qt5的新语法

    //connect(this, &Widget::mySignal, this, &Widget::mySlot);


好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***