深入理解Qt4/Qt5信号和槽机制

本文深入探讨Qt的信号和槽机制,对比MFC的消息映射,阐述其强大与灵活性。内容包括信号和槽的基本概念、Qt5中的新特性如Lambda表达式的使用,以及信号和槽的注意事项,例如避免在可能导致阻塞的代码段中连接定时器信号。同时,文章讨论了多线程环境下非基本类型信号槽的问题及其解决方案。
摘要由CSDN通过智能技术生成

对于事件处理,MFC中使用的是消息映射机制,Qt使用的是信号和槽机制,在我看来,Qt的信号和槽比MFC功能更强大,也更灵活。
1、信号和槽的简单介绍:
一般格式:

connect(Sender,SIGNAL(signal),Receiver,SLOT(slot));  
connect(信号发送者,信号,信号接受者,槽函数);

做个很简单的比喻:运动比赛,裁判员鸣枪,运动员起跑,信号发送者是裁判,信号是枪声;信号接受者是运动员,槽函数(对信号做出的响应)是起跑。

所有的QObject都可以使用信号和槽机制,而Qt中的大部分类都是继承于QObject,SIGNAL()和()SLOT()是Qt定义的两个宏,他们返回其参数的C语言风格的字符串(const *char,信号加前缀2,槽加前缀1),因此下面的两个语句是相同的:

connect(Object2,SIGNAL(clicked()),Object3,SLOT(functionA())); 
connect(Object2,"2clicked()",Object3,"1functionA()");   

例如:

    QTimer *mytimer = new QTimer(this);
    mytimer->start(1000);
    connect(mytimer,"2timeout()",this,"slot_timer()"); 
    //等于 
    //connect(mytimer,SIGNAL(timeout()),this,SLOT(slot_timer()));

需要注意的是:
不论是信号还是槽函数,在SIGNAL()和SLOT()中使用时,参数只能包含变量类型,不能包含变量名,所有QVariant支持的参数类型,信号槽都支持,值得注意的是,QVariant和信号槽都不支持string类型,需要用函数qRegisterMetaType()注册一下,注册方法见第四条

2、信号和槽的变化:

//一个信号可以与另一个信号相连 
connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal2)); 
//同一
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值