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

对于事件处理,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)); 
//同一

你可能感兴趣的:(QT,Qt之路,Qt,信号和槽,Lambda)