Meta-Object,信号和槽

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, 可是它已经被销毁了,所以为引起问题,如果把两个对象的创建顺序调换一下,就没问题了。

你可能感兴趣的:(Meta-Object,信号和槽)