编程csdn

核心提示前面说过,Qt使用的是自己的预编译器,它提供了对C++的一种扩展。利用Qt的信号槽机制,就可以把彼此独立的模块相互连接起来,不需 要实现知道模块的任何细节。 为了达到这个目的,Qt提出了一个Meta-Object系统。它提供了两个关键的作

如前所述,Qt使用自己的预编译器,它提供了对C++的扩展。使用Qt的信号插槽机制,独立的模块可以相互连接,而不需要意识到模块的任何细节。

为了实现这个目标,Qt提出了一个元对象系统。它提供了两个关键功能:信号槽和自检。

在面向对象编程中会提到Smalltalk语言有一个元类系统。元类就是我们所说的元类。如果你曾经写过HTML,你会知道在HTML标签里有一个,用来解释页面的一些属性。同样,Qt的元对象系统也扮演着类似的角色。自省,也称为反射,允许程序在运行时获得关于类的信息,即元信息。什么是元信息?比如这个班叫什么?它的属性是什么?有什么办法吗?它的信号列表?它的槽表等等就是这个类的元信息,也就是“元信息”。这个机器系统也为国际化提供支持,是QSA的基础。

C++没有Qt的元信息所要求的动态元信息。所以Qt提供了一个独立的工具moc,通过定义Q_OBJECT宏来实现从标准C++函数的转换。Moc是纯C++实现的,所以可以用在任何编译器上。

这种机制的工作过程是:

首先,Q_OBJECT宏声明了一些q _ object的子类必须实现的内省函数,如metaObject、tr、qt_metacall等。

其次,Qt的moc工具实现了Q_OBJECT宏声明的函数和所有信号;

第三,QObject成员函数connect和disconnect使用这些自省函数来连接信号插槽。

这些过程都是由qmake、moc和QObject自动处理的,不需要你去想。如果你对实现很好奇,可以看看QmetaObject的文档和moc的源代码。

 
友情链接
鄂ICP备19019357号-22