深入探究connect函数

来源:互联网 发布:魔扣少儿编程网址 编辑:程序博客网 时间:2024/06/05 19:53

QObject::connect函数的学习

信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。

信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信。

(1)信号:当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。

(2)槽:用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。

(3)信号与槽的连接:所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。

connect(sender, SIGNAL(signal), receiver,SLOT(slot));

函数定义:bool QObject::connect ( const QObject * sender, const char * signal, 
const QObject * receiver, const char * member ) [static]

其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。

SIGNAL 和 SLOT是将其内容转为字符串,并且在前面加上标识符。

connect调用后,emit() signal会直接调用之前connect过的SLOT函数。

SIGNAL()宏和SLOT()宏中的函数的参数一定要严格一致。

connect中的常量参数,引用参数,一般参数;

1:  SIGNAL函数, 常量引用参数, SLOT函数的参数一般链接也应该是常量引用参数;如:

signals:
void resultReady( const QString & s);

public slots:

void slot_string( const QString & str )
{
// str = "123";
qDebug()<<str;
}

connect( this, SIGNAL(resultReady(const QString&)), this, SLOT(slot_string(const QString&)) , Qt::DirectConnection);

因为上述是const参数,所以slot中无法修改参数数据;如果想修改数据有两个方法:

(1): 赋值一个新的变量应用;

(2): 修改slot函数参数:

void slot_string( QString str )
{
str = "123";
qDebug()<<str;
}

connect( this, SIGNAL(resultReady(const QString&)), this, SLOT(slot_string(QString)) , Qt::DirectConnection);

注:1:大部分的Qt的SIGNAL函数都是常量引用参数;

2: SIGNAL函数, 引用参数, SLOT函数的参数也可以是 引用参数 或一般参数;

3:SIGNAL函数和SLOT函数都是一般参数;

说明:

1:这里主要讲的是区别就是在connect的时候,SGNAL ,SLOT的参数在引用于非引用对效率的影响和参数数据的修改;

2:在线程间参数传递的时候,SGNAL和SLOT位于两个不同的线程,如果connect的链接类型是Qt::QueuedConnection非阻塞运行,SLOT的参数是一般参数,那么SLOT函数的参数就是一个数据copy,

在线程emit SGNAL后,如果线程中作为从参数的数据丢失或改变,但是SLOT函数用因为有数据备份,所以SLOT函数中的参数数据不会受到影响;

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

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

这个函数断开发射者中的信号与接收者中的槽函数之间的关联


原创粉丝点击