信号与槽机制

Qt信号与槽机制是类型安全的,松耦合,更灵活方便;

信号(Signal)是在特殊情况下发射的事件,如PushButton最常见的鼠标单击发射的clicked()信号,发射信号使用Qt的emit关键字,Qt的signals关键字指出进去了信号声明区,随后可声明自己的信号;

定义信号:

signals:
	void ComeOn(QString &str);//信号不能与无需实现

发射信号:

QString str="666";
emit ComeOn(str);

槽(Slot)就是对信号响应的函数,可以声明在类的任何部分(public\private\protected)可以具有任何参数,也可以被直接调用。槽函数与一般函数不同,槽函数可以与一个信号关联,放信号被发射时,关联的槽函数自动执行。

声明槽函数的方法:

private slots:
	void ComeOnGuys(QString &str);
//槽函数处理工作
void ComeOnGuys(QString &str){
	qDebug() << str;//需加头文件#include<qDebug>
}

信号与槽关联是用 QObject::connect() 函数实现:
QMetaObject::Connection QObject::connect(
const QObject *sender, //信号发送者
const char *signal, //发送的信号
const QObject *receiver, //信号接收者
const char *method, //表示与信号连接的方式的字符串,可以是槽或信号
Qt::ConnectionType type = Qt::AutoConnection //连接方式,默认自动连接
)
常用格式:connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
connect方法采用SIGNAL()及SLOT()时,这里的函数原型只能写出类型,不能有任何参数名,否则连接将会失败。

同时信号与槽连接方式:
1)Qt::AutoConnection:(默认连接方式)自动方式,由系统自动选择连接方式。
2)Qt::DirectConnection:直接方式,信号发射时,立即调用槽。
3)Qt::QueuedConnection:队列方式,信号发射时产生一个事件进入队列,事件被处理时槽才能调用。
4)Qt::BlockQueuedConnection:阻塞队列方式,信号发射时产生一个事件进入队列,然后当前线程进入阻塞状态,直到事件处理完毕,若接收方位于发送信号的线程中,则程序会死锁,故此连接方式仅用于多线程。

信号与槽的关联特点:
在这里插入图片描述1、一个信号连接一个槽

connect(sender, SIGNAL(single1()), receiver, SLOT(slotFun()));

2、一个信号连接一个信号

connect(sender, SIGNAL(single1()), receiver, SIGNAL(single2()));

3、一个信号连接多个槽,关联信号的槽函数按建立时的顺序依次执行

connect(sender, SIGNAL(single1()), receiver1, SLOT(slotFun()));
connect(sender, SIGNAL(single1()), receiver2, SLOT(slotFun()));
connect(sender, SIGNAL(single1()), receiver3, SLOT(slotFun()));

4、多个信号连接一个槽

connect(sender1, SIGNAL(single1()), receiver, SLOT(slotFun()));
connect(sender2, SIGNAL(single2()), receiver, SLOT(slotFun()));
connect(sender3, SIGNAL(single3()), receiver, SLOT(slotFun()));

5、信号与槽的自动关联
_xxxx.h文件中 connectSlotsByName()方法通过对象名支持信号与槽的自动关联。不采用connect()函数而是采用on_objectName_signal命名方式命名槽达到自动关联的效果
如类头文件中声明槽方法:

private slots:
	void on_sjBtn_clicked();//自动连接,on_对象名_信号

信号与槽断开连接

disconnect(const QObject* sender,const char* signal,const QObject *receiver,const char* method);

1、断开与一个信号的所有连接

disconnect(sender,0,0,0);

2、断开一个指定信号的所有关联

disconnect(sender, SIGNAL(single1()), 0, 0); 

3、断开与一个指定接受者receiver的所有关联

disconnect(sender, 0, receiver, 0); 

4、断开指定信号与槽的关联

//第一种方法
disconnect(sender, SIGNAL(single1()), receiver, SLOT(slotFun())); 

//第二种方法
private:
	QmetaObject::Connection m_res;//保存信号与槽的返回值
	--------------------------------------
	m_res = connect(this,SIGNAL(Comeon(QString &)),this,SLOT(ComeonGuys(QSring &)));
	disconnect(m_res);

信号与槽机制的优越性:
1.信号与槽机制是类型安全的,相关联的信号与槽参数必须匹配
2.信号与槽是松耦合的,信号发送者不知道也不需知道接受者的信息。
3.信号与槽可以使用任意类型的任意数量的参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值