信号与槽机制

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
    评论
Qt信号机制是其最重要的特性之一,它提供了一种灵活而高效的通信方式。信号可以在不同对象之间进行通信,使得这些对象能够相互响应和交互。 信号Qt中定义的一种特殊的函数,用于表示某个事件的发生。一个类可以定义一个或多个信号信号可以在特定的情况下被触发,比如用户点击了一个按钮或者其他的操作发生了一些特定的事件。信号的声明通常位于类的头文件中。 是一个特殊的成员函数,用于接收信号并对其进行响应。一个类可以定义一个或多个函数,用于处理不同的信号函数可以有任意的参数和返回值,但是需要与信号的参数列表和返回值类型匹配。函数的声明通常位于类的头文件或者源文件中。 信号通过Qt的元对象系统来进行连接。当信号被触发时,与之相关联的函数会被调用。信号之间的连接可以通过Qt提供的connect函数来实现,也可以在Qt Creator中通过可视化界面来进行连接。 信号之间的连接是动态的,可以在运行时进行创建、修改和断开。这种机制使得对象之间的通信变得非常灵活,能够很好地支持Qt的事件驱动编程模型。 总结起来,Qt信号机制是一种通过信号函数来实现对象间通信的灵活机制信号用于表示事件的发生,函数用于对信号进行响应。通过Qt的元对象系统,可以在运行时动态地连接、修改和断开信号之间的关联。这种机制使得对象之间的通信变得简单而高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值