一、信号和槽
信号和槽机制是QT编程的基础,它们和普通的C++函数几乎是一样的,可以是虚函数,可以被重载,可以是保护、私有或共有的。
信号和槽通过connect()语句连接在一个,形式如下:
connect(sender,SIGNAL(signal),receiver,SLOT(slot));
这里sender和receiver是指向QObject的指针,signal和slot是函数名。每当发射信号时,就会自动的调用所连接的槽。
一个信号可以连接多个槽,这样当信号发射时就会以不定顺序的一个一个执行槽。
多个信号也可以连接一个槽,这样任何一个信号发射时槽都会被执行。
可以通过disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char *method ) 断开信号与槽间的联系。
信号通过emit发射。
信号与槽连接成功必须要求他们的参数具有相同的顺序和相同的类型。但有个例外就是当信号的参数比槽参数多是,多余的参数将会被简单的忽略。
二、QT的元对象系统
QT的元对象系统建立在下面3个的基础上
- QObject类为所有对象提供了一个应用元对象系统的基类。
- 类中私有域的Q_OBJECT宏是用来激活元对象特征,例如动态属性,信号,槽。
- 元对象编译器为每一个QObject子类提供必要的代码来实现元对象特征。
元对象系统是这样工作的:
- Q_OBJECT宏声明了在没有给QObject子类中必须实现的内省函数,如metaObject(),tr(),qt_metacall()等等。
- QT的moc工具生成了用于由O_OBJECT声明的所有函数和所有信号的实现。
- 像connect(),disconnect()这样的QObject的成员函数使用这些内省函数来完成他们的工作。
所有的工作都由qmake,moc,QObject自动处理。