【深入QT】信号槽机制浅析

本文深入探讨了QT的信号槽机制,包括其类型安全、线程安全和松耦合的特点。详细介绍了信号与槽的定义,如何通过connect和disconnect进行连接与断开,以及不同类型的连接方式如QueuedConnection、BlockingQueuedConnection和DirectConnection。同时,讨论了QT对象所属线程的概念,并提供了一个利用信号槽实现线程切换的示例。
摘要由CSDN通过智能技术生成

一、信号槽的基本概念

关于QT信号槽的基本概念大家都懂,通过信号槽机制,QT使对象间的通信变得非常简单:

A对象声明信号(signal),B对象实现与之参数相匹配的槽(slot),通过调用connect进行连接,合适的时机A对象使用emit把信号带上参数发射出去,B对象的槽会就接收到响应。

 

信号槽机制有一些特点:

1.   类型安全:只有参数匹配的信号与槽才可以连接成功(信号的参数可以更多,槽会忽略多余的参数)。

2.   线程安全:通过借助QT自已的事件机制,信号槽支持跨线程并且可以保证线程安全。

3.   松耦合:信号不关心有哪些或者多少个对象与之连接;槽不关心自己连接了哪些对象的哪些信号。这些都不会影响何时发出信号或者信号如何处理。

4.   信号与槽是多对多的关系:一个信号可以连接多个槽,一个槽也可以用来接收多个信号。

 

使用这套机制,类需要继承QObject并在类中声明Q_OBJECT。下面就对信号槽的实现做一些剖析,了解了这些在使用的时候就不会踩坑喽。

二、信号与槽的定义

槽:用来接收信号,可以被看作是普通成员函数,可以被直接调用。支持public,protected,private修饰,用来定义可以调用连接到此槽的范围。

1. public slots:  

2.     void testslot(const QString& strSeqId);  

信号:只需要声明信号名与参数列表即可,就像是一个只有声明没有实现的成员函数。

1. signals:  

2.     void testsignal(const QString&); 

QT会在moc的cpp文件中实现它(参考下面代码)。下面代码中调用activate的第三个参数是类中信号的序列号。

1. // SIGNAL 0  

2. void CTestObject:: testsignal (const QString & _t1)  

3. {  

4.     void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };  

5.     QMetaObject::activate(this, &staticMetaObject, 0, _a);  

6. }  

三、信号槽的连接与触发

通过调用connect()函数建立连接,会把连接信息保存在sender对象中;调用desconnect()函数来取消。

connect函数的最后一个参数来用指定连接类型(因为有默认,我们一般不填写),后面会再提到它。

1. static 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值