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