Meta-Object,信号和槽
Qt成功能一个主要的方面就是对 C++的扩展, 使之能
把彼此独立的软件模块连接起来,而不需要模块间
的任何细节。这就是元对象模型(Meta-Objecct Model)系统, 它提供了两个关键的特性: 信号/槽和内省
(introspection), 内省功能允许程序在运行时能得到QObject子类的元信息(meta-information), 其中包
含了全部信号和槽列表, 类名字,属性, 内容相关的文本翻译支持, 它以是构成QSA的基础.
这个机制的工作过程如下:
● Q_OBJECT声明了一些QObject子类必须实现的内省函数:metaObject(),TR(),qt_metacall()等
● Qt的moc工具实现Q_OBJECT宏声明的函数和所有的信号.
● QObject成员函数connect()和disconnect()使用这些内省函数实现信号和槽的连接.
一个信号可以连接多个槽,担调用顺序是随机的; 多个信号可以连接到一个槽;一个信号可以连接到另一
个信号,
第一个信号发出后,第二个信号也同时发送; 连接可以被删除; 连接的信号和槽必须有相同的参数
类型才能成功连接,如果信号里的参数多于槽的参数,多余的被忽略;
纯粹的信号函数,可以不用实现,只有定义就行了.
对象树:QObjects将它们自己组织为一个对象树,一个对象被销毁时,它会自动销毁它的所有了对象,并将自己父对象的children()列表中移除。我们只
需要记住的是如果创建了一个没有父对象的对象时,必须自己销毁它们。可以使用QOjbect::dumpObjectTree(),QObject::dumpObjectInfo()来观察程序的对象树。
对象的构造/销毁顺序:在对象创建在堆中时(使用new),它们可能以任意的顺序构造和销毁;当对象创建在栈中时,根据C++标准,它们以创建时相反的顺序销毁。来考虑如下的代码:
int main() { QPushButton quit("Quit"); QWidget window; quit.setParent(&window); ... } |
这时当父对象window销毁时,他会同时销毁他的所有子对象,在这里是quit, 在window对象被销毁后,系统会继续销毁下一个在栈中的对象quit, 可是它已经被销毁了,所以为引起问题,如果把两个对象的创建顺序调换一下,就没问题了。